2012-04-07 12 views
1

私はファイルを検索してその結果をパイプのような他のコマンドに送るプログラムを作っています。 ls |ソート 私はプログラムを実行すると何も起こりません。私が思う問題は、子供が親が読み込みを開始するためにSOバッファに書き込みを停止するのを待つことです。 これはstdoutに送信するもので、パイプが他のコマンドに送るべきものです。パイプとフォークのトラブル

[email protected]:~/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); 
+0

を行うことができ、子プロセスは、(「ハング」)走り続けるん、またはそれが途中で終了していますか?言い換えれば:SIGCHLDやSIGPIPEを扱っていますか? – wildplasser

+0

ハングアップします。プロセスは実行を継続します。 – beerLantern

+0

すべてを印刷した後に親stdoutを閉じると機能します。後で標準出力に書きたい場合は、それを再び開くために何をすべきですか? – beerLantern

答えて

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

ありがとうございました。私はそれらの詳細が大好きです。それは実際に動作します。私はstdoutを閉じる前にfflushを作らなければならなかった。今それは動作します! – beerLantern

関連する問題