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);
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
Es hängt. Der Prozess läuft weiter. – beerLantern
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