Linux进程通信
作者 佚名技术
来源 Linux系统
浏览
发布时间 2012-04-01
进程之间没有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"对象,并有一个唯一的标识符. 标识符 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |
你可能对下面的文章感兴趣
关于Linux进程通信的所有评论