2017-06-12 7 views
-1

datewcをCentOSのパイプで使用しようとしています。私はprintfには私がparentまたはchildにいることができません。どんな助けもありがとうございます。フォーク後に親と子でPrintfが印刷されない

#include <stdio.h> 
#include <pthread.h> 
#include <unistd.h> 
#include <assert.h> 
#include <time.h> 
#include <stdlib.h> 
#include <semaphore.h> 
#include <string.h> 
#include <stdlib.h> 
#include <fcntl.h> 

/* pipe1.c - send information through pipe. */ 

void syserr(char* msg) 
{ 
    printf("%s", msg); 
} 

void child(int pfd[]){ 
    dup2(pfd[1],1); 
    execl("/bin/date", "date", 0); 
} 

void main() 
{ 
    int pfd[2], i, pid; 
    char str[] = "Hello World!\n"; 

    if (pipe(pfd) == -1) 
     syserr("pipe"); 

    printf("pfd[0] = %d, pfd[1] = %d\n", pfd[0], pfd[1]); 
    pid=fork(); 

    switch(pid) { 
     case -1: 
       syserr("fork"); 
     case 0: 
      { 
       printf("I'm child'"); 
       child(pfd); 
      } 
     default:{ /* parent only */ 
      if(pid!=0) 
      { 
       printf("I'm parent'"); 
       dup2(pfd[0],0); //input 
       execl("/bin/wc", "wc", 0);   
      }/*default*/ 
     } /*switch*/ 
    } 
} 
+1

'popen'を使用することを検討してください。そして、あなたは 'date'をフォークする必要はありません。 [time(7)](http://man7.org/linux/man-pages/man7/time.7.html)を読み、[time(2)](http://man7.org/linux/man -pages/man2/time.2.html)、[localtime_r(3)](http://man7.org/linux/man-pages/man3/localtime_r.3.html)、[strftime(3)](http ://man7.org/linux/man-pages/man3/strftime.3.html)(これは 'date'が使用しています) –

+2

' syserr'を 'perror'で置き換えます。 –

答えて

2

<stdio.h>がバッファリングされることに注意してください、そしてSTDOUTは、それが端末である、少なくとも場合、一般的にラインバッファリングされます。 setvbuf(3)

を参照してください。printf形式の制御文字列のそれぞれを\nで終了するか、適切な場所にfflush(3)と呼んでください。特に、forkexeclの前にfflush(NULL);を実行してください。

また、システムコールの失敗の原因を理解するために、失敗した場合はperrorを使用してください(つまり、syserrをすべてperrorに置き換えてください)。 perror(3) & errno(3) & strerror(3)を参照してください。

ご参考までに、mainは間違って宣言されています。コンパイル時にすべての警告とデバッグ情報を有効にする必要があります(例えば、gcc -Wall -Wextra -gでコンパイルしてください)。コードを改善して警告を表示しないようにする。その後zombie processesを回避するために、デバッガgdb ...

お知らせを使用し、あなたの親プロセスはwaitpid(2)のようないくつかの待機システムコールを使用するか、(2)またはwait4(2

+0

ありがとうございます。私はあなたが言ったようにコードを編集しました。さて、 'execl("/bin/wc "、" wc "、0);のように見えますが、動作しません。 wcはそのパス '/ bin/wc'に存在します。 –

+0

現在動作中です。子ではclose(pfd [0]);を、親ではclose(pfd [1]);を追加しなければならなかった。 –

1

作品になりまし待つ必要があります。子供にはclose(pfd[0]);、親にはclose(pfd[1]);を追加する必要がありました。

#include <stdio.h> 
#include <pthread.h> 
#include <unistd.h> 
#include <assert.h> 
#include <time.h> 
#include <stdlib.h> 
#include <semaphore.h> 
#include <string.h> 
#include <stdlib.h> 
#include <fcntl.h> 

/* pipe1.c - send information through pipe. */ 


void child(int pfd[]){ 
    printf("I'm in child func\n"); 
    close(pfd[0]); 
    dup2(pfd[1],1); 
    execl("/bin/date", "date", 0); 
} 

int main(){ 
    int pfd[2], pid; 

if (pipe(pfd) == -1) perror("pipe"); 
printf("pfd[0] = %d, pfd[1] = %d\n", pfd[0], pfd[1]); 
fflush(NULL); 
pid=fork(); 
    switch(pid) { 
     case -1: 
       perror("fork"); 
     case 0: 
      { 
        printf("I'm child\n"); 
       child(pfd); 
      } 
     default:{ /* parent only */ 
      if(pid!=0){ 
       printf("I'm daddy\n"); 
       close(pfd[1]); 
       dup2(pfd[0],0); //input 
       execl("/bin/wc", "wc", 0);   
     }/*default*/ 
    } /*switch*/ 
} 
return 0; 
} 
関連する問題