2012-04-07 2 views
1

Я делаю программу, которая ищет файлы и отправляет результаты другим командам, таким как труба. ls | sort Когда я запускаю программу, ничего не происходит. Проблема, я думаю, в том, что ребенок ждет, пока родитель перестанет писать в буфере 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 после печати всех. Если я хочу позже написать в stdout, что мне делать, чтобы снова открыть это? – beerLantern

ответ

1

BTW Там нет причин, чтобы дублировать 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

Wow thank. Мне нравятся эти детали. Это действительно работает. Я должен был сделать fflush перед закрытием stdout. Теперь это работает! – beerLantern

Смежные вопросы