- 1、本文档共8页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
嵌入式linux应用程序编程 进程间通信
嵌入式linux应用程序编程 进程间通信
一、进程间通信概述
1、进程间通信目的
1)数据传输
一个进程需要将它的数据发送给另一个进程
2)资源共享
多个进程之间共享同样的资源。
3)通知事件
一个进程需要向另一个或一组进程发送消息,通知他们发生了某中事件。
4)进程控制
2、进程间通信方式:
1)管道
2)信号
3)消息队列
4)共享内存
5)信号量
6)套接字
二、管道通信
1、特点
单向的,先进先出,一个进程在管道尾部写数据,另一个进程在管道的头部读出数据。
3、分类
无名管道:用于父进程和子进程的通信
无名管道由pipe()函数创建。
#include unistd.h Int pipe(int filedis[2]);
Filedis[0]用于读管道;filedis[1]用于写管道。
注意:
1)必须在系统调用fork()前调用pipe()函数,否则子进程将不会继承文件描述符。
2)在使用fork()创建子进程时,必须将pipe管道的一端关闭,另一端打开。
步骤:
1)使用pipe()创建一个管道
2)使用fork()函数创建一个子进程。
3)分别在父子进程代码段中编写代码,在读端把pipe_fd[1]端关闭,在写端把pipe_fd[0]端关闭。
4)使用read()和write()函数进行读写。
有名管道:用于运行于系统中的任意两个进程间的通信。
#include sys/types.h
#include sys/stat.h Int mkfifo(const char*pathname,mode_t mode);
Pathname:FIFO文件名
Mode:属性
一旦创建一个FIFO,就可用open打开它,一般的文件访问函数(close、read、write等)的可以用于FIFO。
在打开FIFO时,非阻塞标志(O_NONBLOCK)将对以后的读写产生如下影响:
1)没有使用O_NONBLOCK:访问要求无法满足时进程将阻塞。如果试图读取空的FIFO,将导致进程阻塞。
2)使用O_NONBLOCK:访问要求无法满足时不阻塞,立即出错返回,errno是ENXIO
三、信号通信
1、信号产生方式
1)用户按下按键
2)硬件异常产生信号,如除数为0,无效存储访问等等。
3)进程用kill函数将信号发送给另一个进程
4)用户可用kill命令将信号发送给其他进程
2、常用到的信号
1)SIGHUP:从终端发出的结束信号
2)SIGINT:来自于键盘的中断信号(Ctrl-C)
3)SIGKILL:该信号结束接受信号的进程
4)SIGTERM:kill命令发出的信号
5)SIGCHLD:标识子进程停止或结束的信号
6)SIGSTOP:来自键盘(Ctrl-Z)或调试程序的停止执行信号
3、信号处理方式
1)忽略信号(除了SIGKILL、SIGSTOP两种信号不能忽略之外,其他的信号都可一忽略。)
2)执行用户希望的动作
通知内核在某种信号发生时,调用一个用户函数,在用户函数中,执行用户希望的处理。
3)执行系统默认的动作。
对大多数信号的系统默认动作是终止该进程。
4、信号发送
1)主要函数kill()和raise()函数
2)Kill既可以向自身发送信号,也可以向其他进程发送信号。与kill函数不同的是,raise()函数是向进程自身发送信号。
#include sys/types.h
#include signal.h Int kill(pid_t pid,int signo);//pid为进程号,signo为信号类型。
Int raise(int signo);
3)alarm函数可以设置一个时间值(闹钟时间),当所设置的时间到了时,产生SIGALARM信号。如果不能捕捉到此信号,则默认动作是终止该进程。
#include unistd.h Unsigned int alarm(unsigned int seconds);
Seconds:经过指定秒数后发送信号。
4)pause函数
使调用进程挂起直到捕捉到一个信号。
#include unistd.h Int pause(void);
只执行一个信号处理函数后挂起才结束。
5、信号处理
主要有两种:1)使用简单的signal函数,
2)是使用信号集函数组。
#include signal.h Void(*signal(int signo,void(*func)(int)))(int)
Typedef void(*sighandler_t)(int)
Sighandler_t signal(int signum,sighandler_t handler)
Func可能的值是:
1)SIG_IGN:忽略此信号
2)SIG_DFL:按系统默认方式处理
3)信号处理函数名:使
您可能关注的文档
- 如何改善自闭症交流缺损.doc
- 如何有效地利用多媒体教学初中英语阅读课.doc
- 如何更换发酵床菌种.doc
- 如何构建人力资源管理系统.doc
- 如何构思包装盒设计.doc
- 如何查找歌曲地址.doc
- 如何栽培优质高产美国提子 红提葡萄的发展情.doc
- 如何正确合理的建立MYSQL数据库索引.doc
- 如何有效利用皮肤调查表.doc
- 如何测试与总结处理异议的基本过程.doc
- 课题申报参考:几类延迟索赔模型的风险度量与统计估计.docx
- 课题申报参考:集团化办学对县域高中教育质量的影响与机制研究.docx
- 全面透析动力学中的板块模型(解析).pdf
- 无人机配套产品生产线扩建项目可行性研究报告写作模板-拿地备案.doc
- 年产6万立方钒电解液及年产50吨氟化钪项目可行性研究报告模板-立项拿地.doc
- 课题申报参考:基于组织效能视角的哲学社会科学领域有组织科研实施路径研究.docx
- 福建省2024中考语文文言文梳理七上第2篇陈太丘与友期行课堂讲本课件.pptx
- 新人教九年级上册英语Unit 14(单元测试)(解析版).docx
- 课题申报参考:极端气候对涉农信贷的影响:风险传导与风险治理.docx
- 《企业竞争力分析》课件.ppt
文档评论(0)