C 管道和叉子的问题
我正在制作一个程序,搜索文件并将结果发送给其他命令,比如管道。ls |排序 当我运行程序时,什么也没发生。我想问题是,孩子们在等待父母停止在SO缓冲区中写入以开始读取。 这是它发送给stdout的内容,也是管道应该发送给其他命令的内容C 管道和叉子的问题,c,fork,pipe,execvp,C,Fork,Pipe,Execvp,我正在制作一个程序,搜索文件并将结果发送给其他命令,比如管道。ls |排序 当我运行程序时,什么也没发生。我想问题是,孩子们在等待父母停止在SO缓冲区中写入以开始读取。 这是它发送给stdout的内容,也是管道应该发送给其他命令的内容 troneras@troneras-VirtualBox:~/Escritorio/busca.2012$ ./busca . -n . -print ./permisos.txt ./busca2.c ./mmap.pdf
troneras@troneras-VirtualBox:~/Escritorio/busca.2012$ ./busca . -n . -print
./permisos.txt
./busca2.c
./mmap.pdf
./busca3.c~
./cuadernoso4.2011b.pdf
./busca.c~
./busca.c
./busca2.c~
./busca3.c
我不明白问题出在哪里
if(!strcmp(argv[4],“-pipe”))
{
int-pipefd[2];
int-pid,dummi;
if(管道(pipefd)d_名称);
免费(文件[计数]);
}
等待(&dummi);
}
}//端管
免费(文件);
顺便说一句,没有理由复制argv[]数组。而不是
char *argumentos[argc-4];
int j;
for (j=5;j<argc;j++){
argumentos[j-5]=argv[j];
}
argumentos[j-5]= NULL;
execvp(argv[5],argumentos);
顺便说一句,没有理由复制argv[]数组。而不是
char *argumentos[argc-4];
int j;
for (j=5;j<argc;j++){
argumentos[j-5]=argv[j];
}
argumentos[j-5]= NULL;
execvp(argv[5],argumentos);
具体症状是什么,子进程是否继续运行(“挂起”),还是过早退出?换句话说:您是否处理SIGCHLD和/或SIGPIPE?它挂起。进程一直在运行。如果我在打印完所有内容后关闭父标准输出,它就会工作。如果我想稍后写入stdout,我应该如何再次打开它?在这种情况下,execd程序似乎在其stdin上等待一个字符(或EOF)。关闭管道就可以了。(如果您需要stdout filedescriptor,您应该在将pipefd复制到它之前保存它)当心如果子级退出,父级将得到一个SIGCHLD(如果它试图写入半封闭管道,则会得到一个SIGPIPE)好的,现在它正在做疯狂的事情。我有一个printf(“管道”);在制作管道之前,如果我对该行进行注释,程序将停止工作。具体症状是什么,子进程是否继续运行(“挂起”),还是过早退出?换句话说:您是否处理SIGCHLD和/或SIGPIPE?它挂起。进程一直在运行。如果我在打印完所有内容后关闭父标准输出,它就会工作。如果我想稍后写入stdout,我应该如何再次打开它?在这种情况下,execd程序似乎在其stdin上等待一个字符(或EOF)。关闭管道就可以了。(如果您需要stdout filedescriptor,您应该在将pipefd复制到它之前保存它)当心如果子级退出,父级将得到一个SIGCHLD(如果它试图写入半封闭管道,则会得到一个SIGPIPE)好的,现在它正在做疯狂的事情。我有一个printf(“管道”);在制作管道之前,如果我对该行进行注释,程序将停止工作。哇,谢谢。我喜欢这些细节。它确实有效。我必须先冲一冲,然后才能关上厕所。现在它工作了!哇,谢谢。我喜欢这些细节。它确实有效。我必须先冲一冲,然后才能关上厕所。现在它工作了!
execvp(argv[5],argv+5);