c言語、fork,exec,pipeについて

c言語、fork,exec,pipeについて 初めまして。 現在、fork,exec,pipeを用いて、"ls -l | grep hoge.txt" というコマンドを実行しようとしています。 以下にコードのを貼付けます。 #include <ctype.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <fcntl.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/wait.h> #include <sys/socket.h> #include <signal.h> #include <unistd.h> #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[0][W]); close(fildes[0][R]); execvp(*psp1,psp1); } if(wait(&status) == (pid_t) -1){ perror("error: wait"); exit(1); } 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"); } if(wait(&status) == (pid_t) -1){ perror("error: wait"); exit(1); } fprintf(stderr,"process2 end\n"); } このプログラムを実行すると、正しい結果は表示されるのですが、2番目のプロセスがなぜか終了しません。 いろいろ調べてみたのですが、原因が全くわかりませんでした。 わかる方がいらっしゃいましたら、よろしくお願いします。

C言語関連965閲覧xmlns="http://www.w3.org/2000/svg">500

ベストアンサー

0

>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 <ctype.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <fcntl.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/wait.h> #include <sys/socket.h> #include <signal.h> #include <unistd.h> #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 正常動作しないソースを誤って貼ってました。さしかえました。 よろしくお願い致します。

ThanksImg質問者からのお礼コメント

どうやら親プロセスでもcloseをしなければならないようですね。。。。 ありがとうございました><

お礼日時:2011/12/31 18:23