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);
}