2016-10-26 10 views
4

子プロセスと親プロセスの間にpipe()のコードを記述します。これが正しいコードかどうかを確認する必要があります。ところで、それは答えが見えるものを与える!子プロセスと親プロセスの間のpipe()

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 



int main(int argc, char *argv[]){ 
    pid_t pid; 
    int fd[2]; 
    char buf[20]; 

pipe(fd); 


switch(pid = fork()){ 

    case -1: 
     perror("pipe"); 
     exit(1); 

    case 0: 
     /*child process*/ 
     close(fd[1]); 
     read(fd[0], buf, 20); 
     printf("Child read message from parent: %s\n", buf); 
     exit(1); 
     break; 

    default: 
    /*parent process*/ 
     close(fd[0]); 
     write(fd[1], "Hello from parent\n", 17); 
     break; 
    } 
    return 0; 

} 
+2

これは、コードレビューサイトではありません。

ので、固定のコードは次のようになります。あなたの質問は何ですか? –

+1

実際に私はこれらのコードを書くためのベストプラクティスがあるかどうかを確認する必要がありました。私はこのオペレーティングシステムのものの絶対初心者です。 – Hash

答えて

5

あなたはそれで何もしないので、あなたはpid変数は必要ありませんがswitch文は、主にokです。

親コードもほとんどOKですが、文字列は実際にはNULターミネータなしで18バイト、NULターミネータでは19バイトです。子供の改行とNULターミネーターを扱うのは良い習慣なので、私は17を守り、文字列から改行を削除します。

子コードが間違っています。 readの戻り値を格納するには変数が必要です。 readが成功したことを確認するには、戻り値を確認する必要があります。そして、文字列にNULターミネータを追加する必要があります。 Cプログラミング言語では、"文字列"は、ゼロバイトで終わる文字の配列です(NULターミネータと呼ばれ、'\0'と書かれています)。使用するバッファが常にNULターミネータを保持するのに十分な大きさであることと、すべての文字列がNULターミネータを持っていることを確認することはあなたの仕事です。

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
#include <unistd.h> 

int main(void) 
{ 
    int fd[2]; 
    char buffer[20]; 

    if (pipe(fd) < 0) { 
     perror("pipe"); 
     exit(1); 
    } 

    switch(fork()) { 
     case -1: 
      perror("fork"); 
      exit(1); 

     case 0: 
      /*child process*/ 
      close(fd[1]); 
      ssize_t count = read(fd[0], buffer, sizeof(buffer)-1); 
      if (count <= 0) { 
       perror("read"); 
       exit(1); 
      } 
      buffer[count] = '\0'; 
      printf("Child read message from parent: %s\n", buffer); 
      exit(1); 

     default: 
      /*parent process*/ 
      close(fd[0]); 
      char *message = "Hello from parent"; 
      size_t length = strlen(message); 
      write(fd[1], message, length); 
      break; 
    } 

    return 0; 
} 
+0

私はこれに尋ねます。私はNULLターミネータを忘れていました。しかし、私は明確にするべきことがあります。私はすでに、戻り値をチェックして、読み込みが最初に成功したことを確認したと思いました。 if(pipe(fd)<0){ perror( "pipe"); exit(1); } ' – Hash

+1

@hasinisilva 'pipe'からの戻り値を確認すると、パイプが正常に作成されたかどうかがわかります。通常の条件下でパイプを作成すると 'read'が成功するはずです。しかし、 'read'からの戻り値をとにかくチェックするのは良い習慣です。たとえば、親がメッセージを送る前に 'SIGSTOP'または' SIGKILL'によって親が停止した場合、子の 'read'は失敗します。 – user3386109

+0

今私はそれを得た。私はそれを誤解していた。とにかく感謝して、あなたは私に答えました。私は非常に多くの不確実な点をクリアすることができます。もう一つの混乱は「出口(1)」でした。なぜ他の数値ではなく、常に「1」を使用するのですか。私は0を一度使ってみました。コードは何の問題もなく実行されました。 – Hash

関連する問題