Linux环境进程间通信(一):管道及有名管道(3)
{ if(errno==EAGAIN) printf(\ } else printf(\ real_wnum=write(fd,w_buf,5000); //5000用于测试写入字节大于4096时的非原子性 //real_wnum=write(fd,w_buf,4096); //4096用于测试写入字节不大于4096时的原子性 if(real_wnum==-1) if(errno==EAGAIN) printf(\}
程序2:与程序1一起测试写FIFO的规则,第一个命令行参数是请求从FIFO读出的字节数
#include
#define FIFO_SERVER \
main(int argc,char** argv) { char r_buf[4096*2]; int fd; int r_size; int ret_size; r_size=atoi(argv[1]); printf(\ memset(r_buf,0,sizeof(r_buf)); fd=open(FIFO_SERVER,O_RDONLY|O_NONBLOCK,0); //fd=open(FIFO_SERVER,O_RDONLY,0); //在此处可以把读程序编译成两个不同版本:阻塞版本及非阻塞版本 if(fd==-1) { printf(\ exit(); } while(1) { memset(r_buf,0,sizeof(r_buf));
} ret_size=read(fd,r_buf,r_size); if(ret_size==-1) if(errno==EAGAIN) printf(\ printf(\ sleep(1); } pause(); unlink(FIFO_SERVER); 程序应用说明:
把读程序编译成两个不同版本:
? ?
阻塞读版本:br 以及非阻塞读版本nbr
把写程序编译成两个四个版本:
? ? ? ?
非阻塞且请求写的字节数大于PIPE_BUF版本:nbwg 非阻塞且请求写的字节数不大于PIPE_BUF版本:版本nbw 阻塞且请求写的字节数大于PIPE_BUF版本:bwg 阻塞且请求写的字节数不大于PIPE_BUF版本:版本bw
下面将使用br、nbr、w代替相应程序中的阻塞读、非阻塞读 验证阻塞写操作:
1. 当请求写入的数据量大于PIPE_BUF时的非原子性:
o nbr 1000 o bwg
2. 当请求写入的数据量不大于PIPE_BUF时的原子性:
o nbr 1000 o bw
验证非阻塞写操作:
1. 当请求写入的数据量大于PIPE_BUF时的非原子性:
o nbr 1000 o nbwg
2. 请求写入的数据量不大于PIPE_BUF时的原子性:
o nbr 1000 o nbw
不管写打开的阻塞标志是否设置,在请求写入的字节数大于4096时,都不保证写入的原子性。但二者有本质区别:
对于阻塞写来说,写操作在写满FIFO的空闲区域后,会一直等待,直到写完所有数据为止,请求写入的数据最终都会写入FIFO;
而非阻塞写则在写满FIFO的空闲区域后,就返回(实际写入的字节数),所以有些数据最终不能够写入。 对于读操作的验证则比较简单,不再讨论。 2.5有名管道应用实例
在验证了相应的读写规则后,应用实例似乎就没有必要了。 小结:
管道常用于两个方面:(1)在shell中时常会用到管道(作为输入输入的重定向),在这种应用方式下,管道的创建对于用户来说是透明的;(2)用于具有亲缘关系的进程间通信,用户自己创建管道,并完成读写操作。
FIFO可以说是管道的推广,克服了管道无名字的限制,使得无亲缘关系的进程同样可以采用先进先出的通信机制进行通信。
管道和FIFO的数据是字节流,应用程序之间必须事先确定特定的传输\协议\,采用传播具有特定意义的消息。
要灵活应用管道及FIFO,理解它们的读写规则是关键。 附1:kill -l 的运行结果,显示了当前系统支持的所有信号:
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR 31) SIGSYS 32) SIGRTMIN 33) SIGRTMIN+1 34) SIGRTMIN+2 35) SIGRTMIN+3 36) SIGRTMIN+4 37) SIGRTMIN+5 38) SIGRTMIN+6 39) SIGRTMIN+7 40) SIGRTMIN+8 41) SIGRTMIN+9 42) SIGRTMIN+10 43) SIGRTMIN+11 44) SIGRTMIN+12 45) SIGRTMIN+13 46) SIGRTMIN+14 47) SIGRTMIN+15 48) SIGRTMAX-15 49) SIGRTMAX-14 50) SIGRTMAX-13 51) SIGRTMAX-12 52) SIGRTMAX-11 53) SIGRTMAX-10 54) SIGRTMAX-9 55) SIGRTMAX-8 56) SIGRTMAX-7 57) SIGRTMAX-6 58) SIGRTMAX-5 59) SIGRTMAX-4 60) SIGRTMAX-3 61) SIGRTMAX-2 62) SIGRTMAX-1 63) SIGRTMAX 除了在此处用来说明管道应用外,接下来的专题还要对这些信号分类讨论。 附2:对FIFO打开规则的验证(主要验证写打开对读打开的依赖性)
#include
1. UNIX网络编程第二卷:进程间通信,作者:W.Richard Stevens,译者:杨继张,清华大学出版
社。丰富的UNIX进程间通信实例及分析,对Linux环境下的程序开发有极大的启发意义。 2. linux内核源代码情景分析(上、下),毛德操、胡希明著,浙江大学出版社,当要验证某个结
论、想法时,最好的参考资料;
3. UNIX环境高级编程,作者:W.Richard Stevens,译者:尤晋元等,机械工业出版社。具有丰富
的编程实例,以及关键函数伴随Unix的发展历程。
4. http://www.linux.org.tw/CLDP/gb/Secure-Programs-HOWTO/x346.html 点明linux下
sigaction的实现基础,linux源码../kernel/signal.c更说明了问题; 5. pipe手册,最直接而可靠的参考资料 6. fifo手册,最直接而可靠的参考资料
…… 此处隐藏:1421字,全部文档内容请下载后查看。喜欢就下载吧 ……
相关推荐:
- [建筑文档]2018年公需课:专业技术人员创新能力与
- [建筑文档]2013年福建教师招考小学数学历年真题
- [建筑文档]高中信息技术课flash知识点总结 - 图文
- [建筑文档]电工实训 - 图文
- [建筑文档]最高院公告案例分析100篇(民商篇)
- [建筑文档]南开中学高2017级14-15学年(上)期末
- [建筑文档]五粮液集团战略分析
- [建筑文档]鲁教版(2012秋季版)九年级化学 酸碱
- [建筑文档]超星尔雅2017中国哲学概论自整理题库答
- [建筑文档]关于成为海口金盘饮料公司材料独家供货
- [建筑文档]LNG学习资料第一册 基础知识 - 图文
- [建筑文档]四年级品社下册《好大一个家》复习资料
- [建筑文档]现阶段领导权力腐败的特点及发展趋势
- [建筑文档]魏晋南北朝诗歌鉴赏—嵇康
- [建筑文档]坚持追求真爱是理智的行为 正方一辩稿
- [建筑文档]湘西州刑释解教人员帮教安置工作存在的
- [建筑文档]园林工程试题库及答案
- [建筑文档]计算机长期没有向WSUS报告状态
- [建筑文档]日语最新流行语
- [建筑文档]B62-016 景观进场交底专题会议
- 2018年中考语文课内外古诗词鉴赏专题复
- 高考试题研究心得体会
- C语言基础题及答案
- 电气控制及PLC习题及答案
- 都昌小学家长学校汇报材料
- GMAT作文模板正确使用方法
- 俄军办坦克大赛:中国99式有望与豹2A6
- 成本会计练习题
- 酒店餐饮业最流行的5S管理方法
- 2014-2015学年山东省菏泽市高二(下)
- 《黄鹤楼送孟浩然之广陵》教案、说课、
- 2013年结构化学自测题 有答案版
- 2011西安世界园艺博览会游览解说词(附
- 窗口文明单位示范单位创建活动总结
- 2018满分超星尔雅就业课后练习期末答案
- 韶山市城市总体规划-基础资料
- 苏教版第三单元知识点归纳
- 第4章 曲轴模态分析
- 加大查办案件力度的思考
- 武汉CPC导轨介绍




