プロセス間通信の有名なパイプ通信
2940 ワード
名前付きパイプ(FIFO)
名前付きパイプと基本的なパイプは基本的に同じですが、いくつかの顕著な違いもあります.
1)ネーミングパイプは、ファイルシステムにおいて特殊なデバイスファイルとして存在する
2)異なる祖先プロセス間でパイプを通してデータを共有できる
3)共有パイプのプロセスがすべてのI/O操作を実行した後、名前付きパイプは引き続きファイルシステムに保存し、後で使用する
4)パイプは関連プロセスのみで使用でき、共通の祖先プロセスによってパイプが作成されます.ただし、FIFOにより、関係のないプロセスでもデータ交換が可能
名前付きパイプの作成:
#include
#include
int mkfifo(const char *pathname,mode_t mode);filenameは作成するファイル名です.modeはファイルの開くモードと基本的に似ています.
戻る:成功すると0、エラーが発生すると-1を返します.
mkfifoでFIFOが作成されると、確かに一般的なファイルI/O関数(close,open,read,write,unlinkなど)はFIFOに使用できます.
名前付きパイプと基本的なパイプは基本的に同じですが、いくつかの顕著な違いもあります.
1)ネーミングパイプは、ファイルシステムにおいて特殊なデバイスファイルとして存在する
2)異なる祖先プロセス間でパイプを通してデータを共有できる
3)共有パイプのプロセスがすべてのI/O操作を実行した後、名前付きパイプは引き続きファイルシステムに保存し、後で使用する
4)パイプは関連プロセスのみで使用でき、共通の祖先プロセスによってパイプが作成されます.ただし、FIFOにより、関係のないプロセスでもデータ交換が可能
名前付きパイプの作成:
#include
#include
int mkfifo(const char *pathname,mode_t mode);filenameは作成するファイル名です.modeはファイルの開くモードと基本的に似ています.
戻る:成功すると0、エラーが発生すると-1を返します.
mkfifoでFIFOが作成されると、確かに一般的なファイルI/O関数(close,open,read,write,unlinkなど)はFIFOに使用できます.
//pipe_read.c
#include
#include
#include
#include
#include
#include
#include
#define FIFO "/tmp/myfifo"
int main(int argc,char *argv[])
{
int fd;
char buff[100];
int n_read;
if(mkfifo(FIFO,O_CREAT|O_EXCL)<0)
{
if(errno == EEXIST)
{
printf("cannot create fifo,have a fifo yet
");
}
}
printf("preparing for reading...
");
if((fd=open(FIFO,O_RDONLY,0766))<0)
{
printf("open fifo error!
");
exit(1);
}
while(1)
{
memset(buff,0,sizeof(buff));
if((n_read=read(fd,buff,10))==-1)
{
if(errno == EAGAIN)
{
printf("no data yet
");
}
}
else
{
printf("read len = %d str = %s from FIFO, len = %d
", strlen(buff), buff, n_read);
}
sleep(1);
}
return 0;
}
//pipe_write.c
#include
#include
#include
#include
#include
#include
#include
#define FIFO "/tmp/myfifo"
int main(int argc,char *argv[])
{
int fd;
int n_write;
char w_buff[100];
if(argc==1)
{
printf("argc error
");
exit(1);
}
if((fd=open(FIFO,O_WRONLY,0766))<0)
{
if(errno == ENXIO)
{
printf("open error! no reading process
");
}
printf("open error
");
exit(1);
}
strcpy(w_buff,argv[1]);
while(1)
{
if((n_write=write(fd,w_buff,strlen(w_buff)))==-1)
{
if(errno == EAGAIN)
{
printf("The FIFO has not been read yet
");
}
}
else
{
printf("write str is %s to FIFO
",w_buff);
}
sleep(1);
}
close(fd);
}