2012-04-07 9 views
1

Ich mache ein Programm, das Dateien sucht und seine Ergebnisse an andere Befehle sendet, wie eine Pipe. ls | sort Wenn ich das Programm ablaufe, passiert nichts. Das Problem, das ich denke, ist, dass das Kind darauf wartet, dass das Elternteil im SO-Puffer aufhört, das Lesen zu beginnen. Dies ist, was es an stdout sendet und was die Pipe an den anderen Befehl senden soll.Probleme mit einem Rohr und einer Gabel

[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 

Ich verstehe nicht, was das Problem ist.


 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

Was genau die Symptome sind, tut das Kind Prozess nicht unterbrochen wird („hängt“), oder es ist vorzeitig beenden? Mit anderen Worten: Behandelst du SIGCHLD und/oder SIGPIPE? – wildplasser

+0

Es hängt. Der Prozess läuft weiter. – beerLantern

+0

Es funktioniert, wenn ich den übergeordneten stdout nach dem Drucken alles schließen. Wenn ich später zum stdout schreiben möchte, was soll ich tun, um das wieder zu öffnen? – beerLantern

Antwort

1

BTW Es gibt keinen Grund, die argv [] Array zu duplizieren. Statt

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

Sie könnten genauso gut

execvp(argv[5],argv+5); 
+0

Wow danke. Ich liebe diese Details. Es funktioniert tatsächlich. Ich musste einen fflush machen, bevor ich den stdout schließe. Jetzt funktioniert es! – beerLantern