2

私は FIFO を使用して IPC を実装しようとしてきました。以下を作成しました。正常に動作しているようで、数回テストしたところ、良さそうです。

問題は、何を処理する必要があるかということです。PIPE_BUF のはるか下に書き込みを行うため、読み取りと書き込みがアトミックになることはわかっています。

私はこのようにそれを実行しました

./ライター

./リーダー ./リーダー

たとえば、最初のリーダーが 1 を読み取り、次に 2 番目のリーダーが 2 と 3 を読み取り、次に最初のリーダーが 4 を読み取ります。

ここでコードを見つけて修正したことに注意してください。

ライター.c

#include<stdio.h>
#include<unistd.h>
#include<fcntl.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<string.h>
    int main()
    {
    int fd,fd1;
    fd=open("fifo1",O_WRONLY);
    int data = 1;
    while (1){
    write(fd,&data,sizeof(int));
    usleep(10);
    data++;
    }

    //printf("File Content :%s",s1);
    }

リーダー.c

#include<stdio.h>
#include<unistd.h>
#include<fcntl.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<string.h>
    int main()
    {
    int fd,fname;
    mkfifo("fifo1",0600);
    fd=open("fifo1",O_RDONLY);
    int d = 0;
    while(read(fd,&d,sizeof(int))!=0)
    {
    printf("%d\n",d);
    usleep(10);
    }
    close(fd);
    }
4

1 に答える 1

1

一部のリーダー プロセスが不足すると、readsyscall でブロックされ、ライターは最終的にカーネルによってスケジュールされ、何かを書き込みます。制限はPIPE_BUF、1 つのメッセージの最大サイズに対してのみ重要です (たとえば、読み取り、そのサイズに達することはありません)。

対称的に、ライターが大量に書き込むと、FIFO バッファーがいっぱいになり (上記PIPE_BUF) write、ライター プロセスで syscall がブロックされます。最終的にスケジューラはリーダーを実行します。

read(2)およびwrite(2)のマニュアル ページを参照してください。poll(2)について学ぶことは、多重化する場合にも役立ちます。fifo(7)も参照してください。

PIPE_BUF各アトミック読み取りおよび書き込みの制限です。より大きな読み取りと書き込みは、部分的にしか実行できませんでした。カーネルは、バイト未満で読み取りまたは書き込み操作を実行できる場合PIPE_BUF(つまり、そのようなバイト数が利用可能な場合)、パイプおよび関連するファイル記述子 (FIFO など) 全体で実行されることを保証します。

高度な UNIX プログラミング高度な Linux プログラミングの本を読む

于 2012-08-04T05:33:31.283 に答える