1

Cプログラムでシェルスクリプト「env | grep HOME」をシミュレートするのに苦労していました。29 行目をコメントアウトするとこの問題が解決することがわかりましたが、その理由はよくわかりません! dup2() が子の fd を閉じていたことが原因であるという別の質問を読みましたが、man ページにはそれが示されていません。誰かが私に決定的な理由を与えて、この行動を理解するのを助けることができますか? ありがとうございました!

#include <errno.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
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;
}
4

1 に答える 1

2

あなたのバグを見つけました。これが私にとって適切に終了するものです。これはよくある間違いです:

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

あなたが最初に行っていたのは、ファイル記述子を のブール値に閉じるように設定することでした。fd[x] == -1あなたがやりたかった-1のは、 の戻り値でチェックすることでしclose()た。

于 2014-03-16T03:39:28.887 に答える