2012-03-07 1 views
0

親プロセスで親プロセスの書き込みパイプと子読み取りパイプがあり、親プロセスで 'wait()'を追加する前にすべてうまく動作します。私は違いがないはずだと思うが、私が入力するときにちょうど立ち往生する。私はシステムプログラミングには全く新しいものです。誰でもこれを助けることができますか?wait()を使用するとパイプを読み取ることができませんか?

int main() { 
     char* msg = malloc(sizeof(100)); 
     int fd[2]; 
     pipe(fd); 
     int status; 


if (fork()!=0){ 
    close(fd[0]); 
    dup2(fd[1],1); 
    scanf("%s",msg); 
    puts(msg); 
    wait(&status); 
} 
else { 
    char* buf = malloc(sizeof(100)); 
    close(fd[1]); 
    dup2(fd[0],0); 
    scanf("%s",buf); 
    puts(buf); 
} 
return 0;} 
+1

フォークが-1を返した場合はどうなりますか?適切なエラー処理:それは夕食のためのものです – tbert

答えて

0

wait()を呼び出す前にstdoutをフラッシュしてください。

親プロセスが終了したときに暗黙のフラッシュが行われたため、プログラムはwait()なしで以前は動作していました。

+0

それは動作します!ありがとう。 – north212

1

あなたは親でdup2呼び出し後にfd[1]閉じるのを忘れていました。また、scanfが文字列の最後を読み取ったことを認識させる文字を書く必要があります。 putsを呼び出した後でstdoutを閉じることは片道になります。

0

あなたはおそらくSIGCHLDを使用することを学ぶ、poll(2)(またはselect、またはpselect、またはppoll)のような多重呼び出しを使用することを学ぶ、advanced unix programmingに良い本を読んでください。注意してください。signalハンドラは非常に限定された関数(非同期安全なもの)のみを呼び出すことができ、しばしばvolatile sig_atomic_tという変数を設定する必要があります。

関連する問題