程序执行,但最终输出未显示。我似乎弄乱了输出管道。
删除了execlp(),pipe(),fork()失败的检查,因为它们没有导致上述问题。
#include "iostream"
#include "stdlib.h"
#include "unistd.h"
#include "wait.h"
#include "stdio.h"
#include "fcntl.h"
using namespace std;
int main(int argc, char **argv)
{
int fd[2],status,status2,fd1[2];
pipe(fd);
pipe(fd1);
char buf[12];
switch(fork())
{
case 0:
close(fd[0]);
dup2(fd[1],1);
close(fd[1]);
execlp("ls","ls",NULL);
exit(0);
break;
default:
waitpid(-1,&status,0);
close(fd[1]);
close(fd1[0]);
dup2(fd1[1],1);
close(fd1[1]);
dup2(fd[0],0);
close(fd[0]);
execlp("wc","wc",NULL);
}
switch(fork())
{
case 0:
close(fd1[1]);
dup2(fd1[0],0);
close(fd1[0]);
execlp("wc","wc",NULL); //this is not being redirected to STDOUT
exit(0);
break;
default:
waitforpid(-1,&status2,0);
}
return 0;
}
答案 0 :(得分:1)
似乎第二个fork()不会被执行,因为这两个进程会在execlp指令中变异到程序'ls'和'wc'的代码。 检查是否是这样,也许只需将第一个交换机的默认值中的execlp instruccion更改为第二个交换机即可。
答案 1 :(得分:1)
exec
系列函数不会生成单独的进程,而是替换当前进程。如the man page for execlp中所述,execlp
仅在出现错误时才返回控制权。
因此,如果所有fork
和execlp
次调用都成功,则您的程序无法到达execlp
的第三次调用,因为第一个case
中的一个switch
始终执行1}},并且其中任何一个都会替换您的过程。
同时,我建议你不要在实际问题中解析ls
输出,因为UNIX中的文件名可以包含你可能无法解析的空格字符,换行符等,还有其他选项,例如find
命令可以将文件名与'\0'
分开。