我正在制作一个程序,搜索文件并将其结果发送到其他命令,如管道。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 (pipe(pipefd)<0){
   perror("pipe");
   exit(1);
}

pid = fork();

if (pid<0){
   perror("fork");
   exit(1);
}
if (pid == 0){//Child process
   close(pipefd[1]);//The child is only reading from the pipe
   if(dup2(pipefd[0],0)!=0){perror("dup2");exit(1);}
   close(pipefd[0]);

       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);
   perror("execve: ");

}else{ //parent
   close(pipefd[0]);
   if(dup2(pipefd[1],1)!=1){perror("dup2");exit(1);}
   close(pipefd[1]);

   while(count--){
      if(strcmp(files[count]->d_name,".") && strcmp(files[count]->d_name,"..")){
         printf("%s/%s\n",argv[1],files[count]->d_name);
      free(files[count]);
   }

       wait(&dummi);
}

 }//end pipe
 free(files);

最佳答案

顺便说一下,没有理由复制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);

你也可以
   execvp(argv[5],argv+5);

关于c - 用管子和 fork 的麻烦,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10054473/

10-11 18:58