通过前面的例子我们可以看到管道本身给读写双方提供了同步处理, 可以简单处理实现“没写完不能读”“没有读空缓冲区不能写”。 但如果一个管道的读、 写方有多个, 那么这多个进程间的读写问题仍需要编程人员根据读、 写各方间的关系进行同步处理, 如下例:
父进程生成子进程P1、 P2, 两个子进程分别向管道写入各自的字符串, 而父进程负责读出它们。 两个子进程需要对管道进行写入, 谁先占据管道的写端就能先写入, 单次写入的原子性操作由管道天然提供, 但如果多次写入, 则由于他们之间存在竞争关系, 需要另外的同步控制。 如果两进程写入内容要整体互斥写入, 需要对fd 标志的缓冲区进行加锁和解锁, 以解决临界资源的竞争问题。
锁操作函数:
函数功能是对fd 指定区域进行加锁和解锁,以解决临界资源的竞争问题。 参数说明如下:
①fd 是打开文件的文件描述符,由此函数调用建立锁定;
②len 是要锁定或解锁的连续字节数;
③mode 是指定要采取的操作的控制值。
F_TEST 用于检测在指定的区域中是否存在其他进程的锁定。 如果该区域可访问,lockf()将返回0, 否则返回-1; F_LOCK 和F_TLOCK 都用于锁定文件的某个区域(如果该区域可用)。 F_ULOCK 用于删除文件区域的锁定。
【例5-24】 两个子进程写入与父进程读出的同步处理实例, 其程序流程图如图5.21所示。(www.daowen.com)
图5.21 多个写方写管道的程序流程图
其执行结果如下。
先把lockf 语句注释掉, 编译执行程序的效果是两个写入进程写入的数据会交叉写入缓冲区。
将代码中被注释的lockf 语句解开注释, 再重新编译执行。 由于两个写入进程竞争得到互斥资源——管道缓冲区, 执行得到的效果将是第一个先得到管道并加锁的写入进程先执行, 其数据整体写完时才会释放互斥锁, 两个写入的数据不会交叉写入缓冲区。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。