进程之间没有fork()关系,就 考虑其他的进程
通信方法.
3. 有名管道
--用来解决管道不能提供非父/子关系进程间通信的缺陷,在管道的基础上发展了有名管道(FIFOs).
--尽管Linux系统内部是以文件节点(inode)的形式存在的,但是 其对外的不可见性("无名行"),
我们无法创建新的句柄对其进行访问.而有名管道在Linux系统中以一种特殊的设备文件的形式
存在于文件系统中.这样, 它不仅具有管道的通信功能,也具有了普通文件的优点.
(可以同时被多个进程共享, 可以长期存在等等),有效地解决了管道通信的缺点.
-- 有名管道存在于"文件系统中的文件节点(inode)",可用文件节点的方式来建立有名管道.
#mknod sampleFIFO p 或 --使用chmod改变有名管道的存取权限
#mkfifo -m 0666 sampleFIFO --有存取权限
在当前的文件系统中建立一个名字为sampleFIFO的有名管道.
通过文件列表信息中的p指示符我们可以迅速的辨认出有名管道. #ls -l
prw-r--r-- l root root 0 May 14 16:25 sampleFIFO
-- mknod() ; mknod("/tmp/sampleFIFO",s_IFIFO|0666,0);
建立了名为"/tmp/sampleFIFO"的有名管道,其读写权限是0666(当然,最终的权限还和你的umask
值有关).mknod的第三个参数在创建有名管道时被胡烈,一般填0.
3.1 有名管道的I/o使用
有名管道和管道的操作是相同的,只要注意,在引用已经存在的有名管道时, 要用系统中的文件
函数来打开它,才能接下来进行其他的操作.
4. 文件和记录锁定
"共享资源的保护问题"是多进程操作系统中一个非常重要的问题.
文件和记录锁定可分为"咨询式锁定"和"强制锁定"两种.
System V 和BSD提供的咨询式锁定方式, Linux都支持.
int lockf(int fd, int function, long size); --#include <unistd.h>
//记录锁定, 可以指定锁定的范围. 每个进程独有,用于父子进程间的共享锁定
BSD -- 对指定文件的咨询式锁定和解锁.
int flock(int fd, int operation); --#include <sys/file.h>
//文件多顶. 可以继承,父子进程间使用的是同一锁定,不能用于父子进程间的.
5. Linux的其它上锁技术
创建和使用一个辅助文件, 为了实现文件的锁操作, 采用的第一个技巧用到这样一个事实:
如果文件的"新链接名"已近存在,系统调用link()便会出错,在全程变量ermo中返回EEXIST.
int link(char* existingpath, char* newpath) --#include<unistd.h>
采取的技巧是: 创建一个独立独特临时文件的另一个链接. 如果链接成功, 进程便把文件锁定
了.这时有两个路径指向锁定文件(基于进程号的临时文件和锁文件).然后我们用unlink()系统调用
,把临时文件删除,只剩下一个指向该文件的链接. 当需要解除锁定时,我们就用unlink()删除解除
对该文件的链接.
6. System V IPC [P91]
几种新的进程通讯方式 : "消息队列" "信号量" "共享内存"
显著特点: 是它的具体实例在内核中是以对象的形式出现的, 称为"IPC"对象,并有一个唯一的标识符.
标识符 |