1

子プロセスを fork() して、それらの間にパイプを作成し、引数 argv[1] を子プロセスに送信できます。argv[1] から提供されたファイル名を子に取得させ、execl("/bin/cat","cat",(char *) 0); を実行させたい 子にパイプされたファイル名を execl にルーティングするにはどうすればよいですか?

同封は明確にするための私のコードです:

int main(int argc, char ** argv){
   int fds[2];
   char buffer[100];
   int status;

   if(pipe(fds) == -1){
      perror("pipe creation failed");
      exit(EXIT_FAILURE);
   }

   switch (fork()){

    case 0://child
       close(fds[1]); //close stdout so can only do stdin
       read(fds[0],buffer,strlen(argv[1]));
       printf("from parent: %s\n",argv[1]);
       execl("/bin/cat","cat",(char*)0);
       perror("cat failed");
       exit(20);
       break;

      case -1: //fork failure
       perror("fork failure");
       exit(EXIT_FAILURE);

      default: //parent 
       close(fds[0]); //close stdin so only can do stdout
       write(fds[1],argv[1], strlen(argv[1]));             
   }   

   return (EXIT_SUCCESS);
}
4

1 に答える 1

0

fork()保存時にパイプを介してファイル名を書き込むのはなぜargv[1]ですか?

バッファ長に対して読み取り長をチェックしていません。

末尾の nul を送信してstrlen()いない (含めない) ため、ファイル名文字列のターミネータbufferは初期化されていません。それを修正するに+1は、すべての値に追加します。strlen()それで、

execl("/bin/cat","cat",buffer,(char*)0);

要求したことを実行しますが、閉じstdoutたのでcat(ではないexecl) が失敗し、終了コードをチェックしていません。

于 2013-05-11T18:40:04.320 に答える