欢迎来到天天文库
浏览记录
ID:37860591
大小:91.50 KB
页数:16页
时间:2019-06-01
《Linux进程通信:命名管道FIFO小结》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、Linux下进程之间通信可以用命名管道FIFO完成。命名管道是一种特殊类型的文件,因为Linux中所有事物都是文件,它在文件系统中以文件名的形式存在。在程序中,我们可以使用两个不同的函数调用来建立管道:#include#includeintmkfifo(constchar*filename,mode_tmode);intmknode(constchar*filename,mode_tmode
2、S_IFIFO,(dev_t)0);下面先来创建一个管道:viewplaincopytoclipboardprint?#include
3、#include#include#includeintmain(){intres=mkfifo("/tmp/my_fifo",0777);if(res==0){printf("FIFOcreated");}exit(EXIT_SUCCESS);}#include#include#include#includeintmain(){intres=mkfifo("/tmp/my_fifo",0777);if(res==0){printf(
4、"FIFOcreated");}exit(EXIT_SUCCESS);}编译这个程序:gcc–ofifo1.cfifo运行这个程序:$./fifo1用ls命令查看所创建的管道$ls-lF/tmp/my_fifoprwxr-xr-x1rootroot005-0820:10/tmp/my_fifo
5、注意:ls命令的输出结果中的第一个字符为p,表示这是一个管道。最后的
6、符号是由ls命令的-F选项添加的,它也表示是这是一个管道。虽然,我们所设置的文件创建模式为“0777”,但它被用户掩码(umask)设置(022)给改变了,这与普通文件创建是一样的,所以文件的最终模式为755。打开FIFO一个主
7、要的限制是,程序不能是O_RDWR模式打开FIFO文件进行读写操作,这样做的后果未明确定义。这个限制是有道理的,因为我们使用FIFO只是为了单身传递数据,所以没有必要使用O_RDWR模式。如果一个管道以读/写方式打开FIFO,进程就会从这个管道读回它自己的输出。如果确实需要在程序之间双向传递数据,最好使用一对FIFO,一个方向使用一个。当一个Linux进程被阻塞时,它并不消耗CPU资源,这种进程的同步方式对CPU而言是非常有效率的。有关Linux下命名管道FIFO的读写规则可以参见之前所写的一篇文章:Linux命名管道FIFO的读写规则。一、实验:使用FIFO实现进程间通信两个独立的程序:1
8、.生产者程序,它在需要时创建管道,然后尽可能快地向管道中写入数据。2.消费者程序,它从FIFO中读取数据并丢弃它们。生产者程序fifo2.c:viewplaincopytoclipboardprint?#include#include#include#include#include#include#include#defineFIFO_NAME"/tmp/Linux/my_fifo"#defineBUFFER_SIZEPIPE_BUF#define
9、TEN_MEG(1024*1024*10)intmain(){intpipe_fd;intres;intopen_mode=O_WRONLY;intbytes=0;charbuffer[BUFFER_SIZE+1];if(access(FIFO_NAME,F_OK)==-1){res=mkfifo(FIFO_NAME,0777);if(res!=0){fprintf(stderr,"Couldnotcreatefifo%s",FIFO_NAME);exit(EXIT_FAILURE);}}printf("Process%dopeningFIFOO_WRONLY",getpid());
10、pipe_fd=open(FIFO_NAME,open_mode);printf("Process%dresult%d",getpid(),pipe_fd);if(pipe_fd!=-1){while(bytes
此文档下载收益归作者所有