网站大量收购闲置独家精品文档,联系QQ:2885784924

嵌入式linux应用程序编程 进程间通信.doc

  1. 1、本文档共8页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 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)信号处理函数名:使

文档评论(0)

feixiang2017 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档