2012-01-09 6 views
-1

これは非常に単純なprogram.createパイプです。そしてfork、親プロセスと子プロセスの間のパイプを使用します。 となり、パイプへの書き込みはアトミックを保証しません。コードがパイプに書き込むと原子が確実に表示されないのはなぜですか?

#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <errno.h> 
int main(void) 
{ 
    int pipe_fd[2]; 
    pid_t pid; 
    char r_buf[4096]; 
    char w_buf[4096*2]; 
    int writenum; 
    int rnum; 
    memset(r_buf,0,sizeof(r_buf)); 
    if(pipe(pipe_fd)<0) //create pipe 
    { 
     printf("pipe create error\n"); 
     return -1; 
    } 

    if((pid=fork())==0)   //fork 
    { 
     close(pipe_fd[1]); 
     while(1) 
     { 
      sleep(1); 
      rnum=read(pipe_fd[0],r_buf,1000); 
      printf("child: readnum is %d\n",rnum); 
     } 
     close(pipe_fd[0]); 

     exit(EXIT_SUCCESS); 
    } 
    else if(pid>0) 
    { 
     close(pipe_fd[0]);//write 
     memset(r_buf,0,sizeof(r_buf)); 
     if((writenum=write(pipe_fd[1],w_buf,1024))==-1) 
      printf("write to pipe error\n"); 
     else  
      printf("the bytes write to pipe is %d \n", writenum); 
     writenum=write(pipe_fd[1],w_buf,4096); 
     close(pipe_fd[1]); 
    } 
    return EXIT_SUCCESS; 
} 

result: 
the bytes write to pipe 1000 
the bytes write to pipe 1000 //show write pipe not atomic 
the bytes write to pipe 1000 
the bytes write to pipe 1000 
the bytes write to pipe 1000 
the bytes write to pipe 120 //show write pipe not atomic 
the bytes write to pipe 0 
the bytes write to pipe 0 
...... 

それでは、私は、何故、atmoic meanを書いているのですか?そして、なぜこのプログラムがそれを示しているのですか?

+0

私はあなたが何を求めているのかわからないし、あなたもどちらかと確信していません。一般的に原子性の概念に精通していますか? – duskwuff

+0

あなたの出力はあなたのコードと一致せず、無意味です。 – ninjalj

答えて

0

は不可分here

アトミックマルチスレッド/ -processingシステム内のすべての共有データ構造に確保しなければならないの詳細。

here

+0

非常に良い例、ありがとう! – sinners

+0

@sinnerあなたが私の答えが好きなら、upvoteまで気軽に。答えの横にある上向き矢印をクリックします。ありがとう! –

2

がPIPE_BUFバイトがアトミックでなければならないよりも大きくないパイプへの書き込みは、いくつかの良い例があります。これは、複数のプロセスが同じパイプに同時に書き込みを行う場合、すべてのwrite()がPIPE_BUFバイト以下であれば、それらの内容は混在しないため、1つしか使用しない複数のライターを持つことができるあなたが長い書き込みを必要としない限り、

0

プログラムとその結果は、書き込みがアトミックではないことを示していません。書き込みがアトミックであるということは、write()の1バイトで書かれたバイトは、write()が終了するまで利用できなくなり、そのときはすべてが利用可能になるということです。基本的に、バイトのいずれかを読むことができれば、それらのすべてを読むことができます。あなたはに一度にそれらを読むためにを持っていません。あなたはread()のうちのいくつかだけを選択し、後でread()に残りを得ることができます。複数のバイトから利用可能なバイトがある場合は、write()のバイトとそれ以降のバイトをすべて読み込むこともできます。ここでのすべてのアトミック性の保証は、read()のみ一部のから一部のまでですが、それ以外の場合はread()を選択できません。

もちろん、アトミック書き込みは、パイプのバッファに書き込まれたバイト数の空きがある場合にのみ保証されますが、プログラムは制限に達してはなりません。

関連する問題