Я делаю программу, которая ищет файлы и отправляет результаты другим командам, таким как труба. 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);
Что именно симптомы, делает процесс ребенка продолжают работать («зависает»), или же это выход преждевременно? Другими словами: обрабатываете ли вы SIGCHLD и/или SIGPIPE? – wildplasser
Он висит. Процесс продолжает работать. – beerLantern
Он работает, если я закрываю родительский stdout после печати всех. Если я хочу позже написать в stdout, что мне делать, чтобы снова открыть это? – beerLantern