我正在为我的操作系统课程(Posix&C)做一个任务,构建一个迷你shell,并且我不知道如何解决以下问题:
我的迷你shell必须接受两个命令,例如
现在,问题是进程
那么,我的问题是:如何通知父进程管道已经完成写入,以便例如完成执行
谢谢。
以下是代码:
[fd是管道,它在代码中之前初始化。如果您看到任何不一致的地方,请告诉我;我已经清理了代码,这只是有问题的部分,如您所见。]
我的迷你shell必须接受两个命令,例如
ls | grep a
。为此,我创建了一个大小为2的管道和一个子进程。子进程关闭所有需要关闭的内容并打开所有需要打开的内容(标准/管道的输入和输出)。然后使用execvp执行“ls”,我确信这很好用。之后,父进程关闭和打开输入和输出(我确定我做得很好),然后执行grep a
。现在,问题是进程
grep a
永远不会完成。例如,tail -1
也是如此。但是对于head -1
,它确实有效。我认为发生这种情况是因为由父进程执行的grep
和tail
等命令正在等待更多的输入,即使子进程已经完成其操作。ls | grep a
会产生正确的输出,显示在控制台上(管道的输出被设置为默认输出),但是,正如我所说,grep a
没有完成。那么,我的问题是:如何通知父进程管道已经完成写入,以便例如完成执行
grep a
?谢谢。
以下是代码:
[fd是管道,它在代码中之前初始化。如果您看到任何不一致的地方,请告诉我;我已经清理了代码,这只是有问题的部分,如您所见。]
int fd[2];
pipe(fd);
if ((pid = fork()) != -1){
if(pid == 0){ /*Child executing */
close(fd[0]);
close(1);
dup(fd[1]);
close(fd[1]);
execvp(argvv[0][0], argvv[0]); /* Here's stored the first instruction */
} else{ /* Parent executing */
wait(&status);
close(fd[1]);
close(0);
dup(fd[0]);
close(fd[0]);
execvp(argvv[1][0], argvv[1]); /* Here's stored the second instruction */
}
}
pipe(fd);
的代码。 - caf