【发布时间】:2014-06-09 01:20:52
【问题描述】:
我正在使用 pipe fork 和 exec,为任何两个 shell 程序实现通用管道。我专门使用 ls | grep 来测试它。它起作用了,数据被复制到 grep,grep 搜索匹配项,然后将它们输出到标准输出。但是在那之后程序就挂了。
这是我在检测到管道时执行的代码。我分叉,然后再次分叉,因为我希望第一个分叉的父进程在 exec 调用之后继续运行。我相信由于调试代码,在执行 grep 的 exec() 调用之后没有发生任何事情。
if(pipeFlag == 1){
pipe(fd);
PID = fork();
if (PID == 0){//child process
fPID = fork();
if(fPID == 0){//child of child
printf("in child of child\n");
dup2(fd[1], 1);
execvp(command, argv);//needs error checking
printf("mysh: %s: command not found\n", argv[0]);
exit(EXIT_FAILURE);
}
if(fPID > 0){//parent of 2nd child
printf("in parent of 2nd child\n");
dup2(fd[0], 0);
execvp(command1, argv1);//needs error checking
printf("mysh: %s: command not found\n", argv[0]);
exit(EXIT_FAILURE);
}
if(PID == -1){
printf("ERROR:\n");
switch (errno){
case EAGAIN:
printf("Cannot fork process: System Process Limit Reached\n");
case ENOMEM:
printf("Cannot fork process: Out of memory\n");
}
return 1;
}
}
if(PID > 0){//parent
wait(PID, 0, 0);
printf("in outer parent\n");
}
if(PID == -1){
printf("ERROR:\n");
switch (errno){
case EAGAIN:
printf("Cannot fork process: System Process Limit Reached\n");
case ENOMEM:
printf("Cannot fork process: Out of memory\n");
}
return 1;
}
}
【问题讨论】:
-
看起来这有一个类似的问题,你可以从那里复制解决方案 -- stackoverflow.com/questions/916900/…
-
但他从未找到答案。