1

ファイルを検索し、その結果をパイプなどの他のコマンドに送信するプログラムを作成しています。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);
4

1 に答える 1

1

ところで、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);
于 2012-04-07T13:57:57.447 に答える