xiaobaiso 发表于 2013-1-15 19:02:00

Linux环境进程间通信(一)

原文出自 http://www.ibm.com/developerworks/cn/linux/l-ipc/part1/
 
简介: 在本系列序中作者概述了 linux 进程间通信的几种主要手段。其中管道和有名管道是最早的进程间通信机制之一,管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信。 认清管道和有名管道的读写规则是在程序中应用它们的关键,本文在详细讨论了管道和有名管道的通信机制的基础上,用实例对其读写规则进行了程序验证,这样做有利于增强读者对读写规则的感性认识,同时也提供了应用范例。
 
 附1:kill -l 的运行结果,显示了当前系统支持的所有信号:
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE9) SIGKILL10) SIGUSR111) SIGSEGV12) SIGUSR213) SIGPIPE14) SIGALRM15) SIGTERM17) SIGCHLD18) SIGCONT19) SIGSTOP20) SIGTSTP21) SIGTTIN22) SIGTTOU23) SIGURG24) SIGXCPU25) SIGXFSZ26) SIGVTALRM27) SIGPROF28) SIGWINCH29) SIGIO30) SIGPWR31) SIGSYS32) SIGRTMIN33) SIGRTMIN+134) SIGRTMIN+235) SIGRTMIN+336) SIGRTMIN+437) SIGRTMIN+538) SIGRTMIN+639) SIGRTMIN+740) SIGRTMIN+841) SIGRTMIN+942) SIGRTMIN+1043) SIGRTMIN+1144) SIGRTMIN+1245) SIGRTMIN+1346) SIGRTMIN+1447) SIGRTMIN+1548) SIGRTMAX-1549) SIGRTMAX-1450) SIGRTMAX-1351) SIGRTMAX-1252) SIGRTMAX-1153) SIGRTMAX-1054) SIGRTMAX-955) SIGRTMAX-856) SIGRTMAX-757) SIGRTMAX-658) SIGRTMAX-559) SIGRTMAX-460) SIGRTMAX-361) SIGRTMAX-262) SIGRTMAX-163) SIGRTMAX
除了在此处用来说明管道应用外,接下来的专题还要对这些信号分类讨论。
<a name="b">附2:对FIFO打开规则的验证(主要验证写打开对读打开的依赖性)
#include <sys/types.h>#include <sys/stat.h>#include <errno.h>#include <fcntl.h>#define FIFO_SERVER "/tmp/fifoserver"int handle_client(char*);main(int argc,char** argv){int r_rd;int w_fd;pid_t pid;if((mkfifo(FIFO_SERVER,O_CREAT|O_EXCL)<0)&&(errno!=EEXIST))printf("cannot create fifoserver\n");handle_client(FIFO_SERVER);}int handle_client(char* arg){int ret;ret=w_open(arg);switch(ret){case 0:{printf("open %s error\n",arg);printf("no process has the fifo open for reading\n");return -1;}case -1:{printf("something wrong with open the fifo except for ENXIO");return -1;}case 1:{printf("open server ok\n");return 1;}default:{printf("w_no_r return ----\n");return 0;}}unlink(FIFO_SERVER);}int w_open(char*arg)//0open error for no reading//-1 open error for other reasons//1open ok{if(open(arg,O_WRONLY|O_NONBLOCK,0)==-1){if(errno==ENXIO){return 0;}elsereturn -1;}return 1;}

参考资料

[*]UNIX网络编程第二卷:进程间通信,作者:W.Richard Stevens,译者:杨继张,清华大学出版社。丰富的UNIX进程间通信实例及分析,对Linux环境下的程序开发有极大的启发意义。
[*]linux内核源代码情景分析(上、下),毛德操、胡希明著,浙江大学出版社,当要验证某个结论、想法时,最好的参考资料;
[*]UNIX环境高级编程,作者:W.Richard Stevens,译者:尤晋元等,机械工业出版社。具有丰富的编程实例,以及关键函数伴随Unix的发展历程。
[*]http://www.linux.org.tw/CLDP/gb/Secure-Programs-HOWTO/x346.html 点明linux下sigaction的实现基础,linux源码../kernel/signal.c更说明了问题; 
[*]pipe手册,最直接而可靠的参考资料
[*]fifo手册,最直接而可靠的参考资料
</p> 
 
 
页: [1]
查看完整版本: Linux环境进程间通信(一)