質問: c言語、fork,exec,pipeについて
回答: >m0029_swimさん 以下の修正を行なって正常に動作してます。 (こちらではご質問のソースでは何も出力されませんでした。waitの位置をずらしてはじめて出力でました。 こちらのOSはLinux i386 32bit Debian Sid,CPU シングルコアCeleron 2GHzです。) * pipe(fildes[0]); をコメントアウト * close(fildes[0][W]);close(fildes[0][R]); を close(fildes[1][W]);close(fildes[1][R]); に修正 * 親プロセス側でもclose(fildes[1][R]); close(fildes[1][W]); を実行 * waitの位置を最後に移動 で正常に動作してます。 修正箇所にはコメント入れてます。 --- ex533_2.c #include #include #include #include #include #include #include #include #include #include #include #define R (0) #define W (1) char* psp1[] = {"ls","-l",NULL}; char* psp2[] = {"grep","hoge.txt",NULL}; pid_t cpid; int pipe_num = 0; void main(int argc,char* argv[]){ int fildes[2][2]; int status = 0; /*** pipe(fildes[0]); */ pipe(fildes[1]); if((cpid=fork()) == 0){ dup2(fildes[1][W], STDOUT_FILENO); close(fildes[1][W]); /*** 0->1 */ close(fildes[1][R]); /*** 0->1 */ execvp(*psp1,psp1); } fprintf(stderr,"process1 end\n"); if((cpid = fork()) == 0){ dup2(fildes[1][R], STDIN_FILENO); close(fildes[1][R]); close(fildes[1][W]); if(execvp(*psp2,psp2)<0){ printf("%s:Command not found\n",psp2[0]); } perror("done"); } close(fildes[1][W]); /*** 追加 */ close(fildes[1][R]); /*** 追加 */ if(wait(&status) == (pid_t) -1){ /*** 移動 */ perror("error: wait"); /*** 移動 */ exit(1); /*** 移動 */ } /*** 移動 */ if(wait(&status) == (pid_t) -1){ perror("error: wait"); exit(1); } fprintf(stderr,"process2 end\n"); } こちらではmainがvoid型だとコンパイラワーニングでてます。これは修正してません。 *** 追記1 正常動作しないソースを誤って貼ってました。さしかえました。 よろしくお願い致します。