Linux进程间通信-FIFO管道

也称有名管道,它是一种文件类型,在文件系统中可以看到。程序中可以查看文件stat结构中st_mode成员的值来判断文件是否是FIFO文件。创建一个FIFO文件类似于创建文件,FIFO文件就像普通文件一样。


FIFO的通信方式类似于在进程中使用文件来传输数据,只不过FIFO类型文件同时具有管道的特性。在数据读出时,FIFO管道中同时清除数据。



创建FIFO:

#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>


int main(int argc,char* argv[])
{
mode_t mode = 0666;

if(argc!=2)
{
printf("USEMSG:a.out {fifoname}\n");
exit(1);
}

if( (mkfifo(argv[1],mode))<0)
{
perror("failed to mkfifo");
exit(1);
}
else
printf("you successfully create FIFO file[%s]\n",argv[1]);

exit(0);
}


FIFO读写:

一般的I/O函数(open close read write unlink)都可以用于FIFO文件,需要注意的是,在使用open函数打开一个FIFO文件时,
open函数的flag标志位的O_NONBLOCK标志,它关系到函数的返回状态。


O_NONBLOCK:
置位:  只读open立即返回。当只写open时,如果没有进程为读打开FIFO,则返回-1,并置errno值为ENXIO
不置位: open视情况阻塞.只读open要阻塞到有进程为写打开FIFO,只写open要阻塞到有进程为读打开FIFO。


写:

#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <fcntl.h>
#include <unistd.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>




#define BUF 256


int main(int argc,char* argv[])
{
int fd;
char buf[BUF];
time_t tp;
int i,n;

printf("I am [%d]\n",getpid());

if( (fd=open("file2",O_WRONLY))<0)
{
perror("open");
exit(1);
}

for(i = 0;i < 10;i++)
{
time(&tp);
memset(buf,0,sizeof(buf));
n=sprintf(buf,"write_fifo %d sends %s\n",getpid(),ctime(&tp));
printf("Send msg[%s]\n",buf);

if( (write(fd,buf,n+1))<0)
{
perror("write");
close(fd);
exit(1);
}

sleep(3);
}

close(fd);
exit(0);
}


读:

#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <fcntl.h>
#include <unistd.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>




#define BUF 256


int main(int argc,char* argv[])
{
int fd;
char buf[BUF];
time_t tp;
int i,n;

printf("I am [%d]\n",getpid());

if( (fd=open("file2",O_RDONLY))<0)
{
perror("open");
exit(1);
}

while( (n=read(fd,buf,BUF))>0)
{
printf("read fifo [%s]\n",buf);
memset(buf,0,sizeof(buf));
}

close(fd);
exit(0);


}

你可能感兴趣的:(Linux进程间通信-FIFO管道)