Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 管道和叉子的问题_C_Fork_Pipe_Execvp - Fatal编程技术网

C 管道和叉子的问题

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

我正在制作一个程序,搜索文件并将结果发送给其他命令,比如管道。ls |排序 当我运行程序时,什么也没发生。我想问题是,孩子们在等待父母停止在SO缓冲区中写入以开始读取。 这是它发送给stdout的内容,也是管道应该发送给其他命令的内容

    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);