Linux / C: redirection de canaux vers STDIN / STDOUT

J’avais des problèmes avec la simulation du script shell “env | grep HOME” avec un programme C. J’ai trouvé que commenter la ligne 29 résolvait ce problème, mais je ne savais pas trop pourquoi! J’ai lu sur une autre question que c’était parce que dup2 () fermait le fd dans l’enfant, mais la page de manuel ne l’indique pas. Quelqu’un peut-il me donner une raison définitive et m’aider à comprendre ce comportement? Je vous remercie!

#include  #include  #include  #include  int main(void){ pid_t childpid; int fd[2]; if(pipe(fd) == -1){ /*setup a pipe*/ perror("Failed to setup pipeline"); return 1; } if((childpid = fork()) == -1){ /*fork a child*/ perror("Failed to fork a child"); return 1; } if(childpid == 0){ /*env is the child*/ if(dup2(fd[1],STDOUT_FILENO)==-1) perror("Failed to redirect stdout of env"); else if(close(fd[0] == -1)) /*close unused file descriptor*/ perror("Failed to close extra pipe descriptors on env"); else{ execl("/usr/bin/env", "env", NULL); /*execute env*/ perror("Failed to exec env"); } return 1; } if(dup2(fd[0],STDIN_FILENO)==-1) /*grep is the parent*/ perror("Failed to redirect stdin of grep"); //else if(close(fd[1]==-1)) //perror("Failed to close extra pipe file descriptors on grep"); else{ execl("/bin/grep", "grep", "HOME", NULL); /*execute "grep HOME"*/ perror("Failed to exec grep"); } return 1; } 

J’ai trouvé ton bug. Voici ce qui se passe correctement pour moi. C’est une erreur commune:

 ... else if (close(fd[0]) == -1) /*close unused file descriptor*/ ... else if(close(fd[1]) == -1) ... 

Ce que vous faisiez à l’origine consistait à définir le descripteur de fichier pour qu’il soit fermé à la valeur booléenne fd[x] == -1 , et à vérifier -1 dans la valeur de retour close() .