进程间通信--------有名管道如何产生阻塞
来源:互联网 发布:保定网络推广培训 编辑:程序博客网 时间:2024/06/05 02:07
使用有名管道时,我们经常想要的是这样:在有名管道中没有数据时A进程挂起,当B进程往有名管道里写数据时激活A进程。于是就得考虑有名管道是如何使进程挂起,我们又当如何设置。
首先,在创建管道成功后,我们可以使用open()、read()和write()这些函数来操作有名管道。与普通文件的开发设置一样,对于为读而打开的管道可在open()中设置O_RDONLY,对于为写而打开的管道可在open()中设置O_WRONLY,在这里与普通文件不同的是阻塞问题。由于普通文件在读写时不会出现阻塞问题,而在管道的读写中却有阻塞的可能,这里的非阻塞标志可以在open()函数中设定为O_NONBLOCK。下面分别对阻塞打开和非阻塞打开的读写进行讨论。
对于读进程:
● 若该管道是阻塞打开,且当前FIFO内没有数据,则对读进程而言将一直阻塞到有数据写入。
● 若该管道是非阻塞打开,则不论FIFO内是否有数据,读进程都会立即执行读操作。即如果FIFO内没有数据,则读函数将立刻返回0。
对于写进程:
● 若该管道是阻塞打开,则写操作将一直阻塞到数据可以被写入。
● 若该管道是非阻塞打开而不能写入全部数据,则读操作进行部分写入或者调用失败。
表1列出了mkfifo()函数的语法要点。(表1中有错误:mkfifo()函数的mode参数是设置新建的有名管道的权限,而所列出的O_RDONLY、O_WRONLY等值是新建完成后,调用open()函数时传的第二个参数值,如果设置了O_NONBLOCK,调用read()函数时则不会产生阻塞,在此纠正)
表1 mkfifo()函数语法要点
所需头文件#include <sys/types.h> #include <sys/state.h>函数原型int mkfifo(const char *filename,mode_t mode)函数传入值filename:要创建的管道modeO_RDONLY:读管道O_WRONLY:写管道O_RDWR:读写管道O_NONBLOCK:非阻塞O_CREAT:如果该文件不存在,那么就创建一个新的文件,并用第3个参数为其设置权限O_EXCL:如果使用O_CREAT时文件存在,那么可返回错误消息。这个参数可测试文件是否存在函数返回值成功:0出错:-1表2再对FIFO相关的出错信息进行归纳,以方便用户查错。
表2 FIFO相关的出错信息
EACCESS参数filename所指定的目录路径无可执行的权限EEXIST参数filename所指定的文件已存在ENAMETOOLONG参数filename的路径名称太长ENOENT参数filename包含的目录不存在ENOSPC文件系统的剩余空间不足ENOTDIR参数filename路径中的目录存在但却非真正的目录EROFS参数filename指定的文件存在于只读文件系统内- 进程间通信--------有名管道如何产生阻塞
- 进程间通信--有名管道
- 进程间通信-有名管道
- 进程通信--有名管道
- 进程间通信______有名管道(FIFO)
- 多进程间通信之有名管道
- 进程间通信方式之有名管道
- 进程间通信之有名管道
- 进程间通信编程(3) - 有名管道
- linux进程间通信之有名管道
- 进程间通信(二)有名管道
- 进程间通信(1)-有名管道
- 进程间的通信----有名管道fifo
- 有名管道实现进程间通信。
- 简单的实现在有名管道里,进程间的通信(非阻塞)。
- 进程间通信-管道(有名管道和无名管道)
- linux进程通信-有名管道
- linux进程通信--有名管道
- 4.MFCRTTI,运行时类型信息
- 一致性hash和solr千万级数据分布式搜索引擎中的应用【重要】
- JAVA数据结构之String、StringBuffer和StringBuilder之间的区别
- JS实现人民币小写转换成汉字大写
- 观察者模式 VS 发布/订阅(广播)
- 进程间通信--------有名管道如何产生阻塞
- 求笛卡尔积
- 卸载Linux上默认的JDK
- jquery实现网页自动添加必填项图标和日期自动填充
- c语言 文件操作
- MapReduce编程
- Spark调研笔记第7篇 - 应用实战: 如何利用Spark集群计算物品相似度
- _itoa atoi、atof、itoa、itow _itoa_s 类型转换使用说明
- ZWK so lazy