360免费建站官网入口,济南企业免费建站,网站建设费用报告,python可以做网站前台么1. 什么是FIFO FIFO命名管道#xff0c;也叫有名管道#xff0c;来区分管道pipe。管道pipe只能用于有血缘关系的进程间通信#xff0c;但通过FIFO可以实现不相关的进程之间交换数据。FIFO是Linux基础文件类型中的一种#xff0c;但是FIFO文件在磁盘上没有数据块#xff0c…1. 什么是FIFO FIFO命名管道也叫有名管道来区分管道pipe。管道pipe只能用于有血缘关系的进程间通信但通过FIFO可以实现不相关的进程之间交换数据。FIFO是Linux基础文件类型中的一种但是FIFO文件在磁盘上没有数据块仅仅用来标识内核中的一条通道。各进程可以打开这个文件进行read/write操作实际上是在读写内核通道这样就实现了进程间通信。
创建FIFO的方式
使用命令创建mkfifo 管道名可以理解为创建一个管道伪文件。 使用库函数创建mkfifo()函数并且一旦使用mkfifo()创建了一个FIFO就可以使用open来打开它常见的文件I/O函数都可用于FIFO。如close、read、write、unlink等。 实际上创建一个FIFO命名管道的时候内核会为FIFO伪文件开辟一个缓冲区操作FIFO文件就相当于操作这个缓冲区以此来实现进程间的通信这种通信实际上就是文件读写的操作来实现的。可以把FIFO理解为一个文件一个进程向该文件写数据另一个进程从该文件中读书数据前提是两个进程读写的是同一个FIFO文件才能实现通信 2.当open一个FIFO时是否设置非阻塞标志O_NONBLOCK的区别 若没有执行O_NONBLOCK默认只读open要阻塞到某个其他进程为写而打开此FIFO。类似的只写open要阻塞到其他进程为读而打开它。 若指定了O_NONBLOCK,则只读open立即返回。而只写open将出错返回-1如果没有进程已经为读而打开该FIFO其errno置ENXIO。 3.代码
创建两个进程一个进程向FIFO写数据一个进程从FIFO读数据。
write
#include stdio.h
#include sys/types.h
#include sys/stat.h
#include errno.h
#include unistd.h
#include string.h
#include fcntl.h// int mkfifo(const char *pathname, mode_t mode);
// ssize_t write(int fd, const void *buf, size_t count);int main()
{int cnt 0;char *str message from fifo;int fd open(./ipc-file,O_WRONLY);printf(write open success\n);while(1){write(fd,str,strlen(str));sleep(2);cnt;if(cnt 5){break;}}close(fd);return 0;} read
#include sys/types.h
#include sys/stat.h
#include stdio.h
#include errno.h
#include fcntl.h// int mkfifo(const char *pathname, mode_t mode);int main()
{int cnt 0;char buf[30]{0}; if(mkfifo(./ipc-file,0700)-1 errno ! EEXIST){printf(mkfifo fail);perror(why);} int fd open(./ipc-file,O_RDONLY);printf(open success\n);while(1){int nread read(fd,buf,30);printf(read %d byte from fifo/n,context :%s\n,nread,buf);cnt;if(cnt 3){break;}}close(fd);return 0;}结果