3.linux进程间通信.ppt

  1. 1、本文档共63页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
3.linux进程间通信

struct msgbuf { long mtype; /* type of message */ char mtext[1]; /* message text */ }; msgsnd *msgp 指向要发送消息的指针,消息一般是一个带有long类型的消息类型结构体 msgsz 发送消息的长度,不包括消息类型 flag 控制在消息队列已满时的选项 IPC_NOWAIT 立即返回错误-1 0 等待消息队列有可用空间 msgrcv int msgrcv (int msgid, struct msgbuf *msgp, size_t msgsz,long msgtyp, int flag) 作用: 从消息队列中获取信息 返回:成功返回读出消息的实际字节数,否则返回-1。 msgrcv msgtyp是期望接收的消息类型;0:队列中第一个可用消息;0:相同消息类型的第一个消息;0:类型等于或小于msgtyp绝对值的消息。 flag在消息队列没有没有相应类型的消息可以接受时:IPC_NOWAIT指明立即返回,返回值为-1;若IPC_NOWAIT标志被清除,则发送进程挂起以等待第一条相同类型的消息到达。 msgctl int msgctl(int msgid, int cmd, struct msqid_ds *buf);    msgid:消息队列标识符。 cmd:采取的动作。 IPC_STAT:该命令用来获取消息队列信息,返回的信息存贮在buf指向的msgid结构中; IPC_SET:该命令用来设置消息队列的属性,要设置的属性存储在buf指向的msgid结构中; IPC_RMID:删除msgid标识的消息队列; msg_read.c msg_write.c 消息队列与管道 消息队列和管道都是一头写,一头读! 消息队列和管道的不同点: 消息队列无需固定的读写进程,任何进程都可以读写 消息队列可以支持多个进程,多个进程可以读写消息队列,即消息队列可以实现多对多,而管道只能是点对点 消息队列只在内存中实现。 消息队列不是只在UNIX和类UNIX操作系统中实现。几乎所有主流操作系统都支持消息队列。 信号通信 信号是软件中断。信号(signal)机制是Unix系统中最为古老的进程之间的通信机制。它用于在一个或多个进程之间传递异步信号。 很多条件可以产生一个信号。 当用户按某些终端键时,产生信号。在终端上按DELETE键通常产生中断信号(SIGINT)。这是停止一个已失去控制程序的方法。 硬件异常产生信号:除数为0、无效的存储访问等等。这些条件通常由硬件检测到,并将其通知内核。然后内核为该条件发生时正在运行的进程产生适当的信号。例如,对执行一个无效存储访问的进程产生一个SIGSEGV。 用户可用kill (1)命令将信号发送给其他进程。此命令是kill函数的调用。常用此命令终止一个失控的后台进程。 进程用kill (2)函数可将信号发送给另一个进程或进程组。自然,有些限制:接收信号进程和发送信号进程的所有者必须相同,或发送信号进程的所有者必须是超级用户。 当检测到某种软件条件已经发生,并将其通知有关进程时也产生信号。这里并不是指硬件产生条件(如被0除),而是软件条件。例如SIGURG (在网络连接上传来非规定波特率的数据)、SIGPIPE (在管道的读进程已终止后一个进程写此管道),以及SIGALRM(进程所设置的闹钟时间已经超时)。 信号发送 kill()不仅可以中止进程,也可以向进程发送其他信号。 与kill函数不同的是,raise()函数用于向进程自身发送信号。 #include sys/types.h #include signal.h int kill(pid_t pid, int signo) ; int raise(int signo) ; 两个函数返回:若成功则为0,若出错则为-1。 kill的pid参数有四种不同的情况: pid 0 将信号发送给进程ID为pid的进程。 pid == 0 将信号发送给其进程组ID等于发送进程的进程组ID,而且发送进程有许可权向其发送信号的所有进程。 pid 0 将信号发送给其进程组ID等于pid绝对值,而且发送进程有许可权向其发送信号的所有进程。如上所述一样,“所有进程”并不包括系统进程集中的进程。 练习 在主进程退出前给子进程发送信号,使子进程退出 内核为进程生产信号,来响应不同的事件,这些事件就是信号源。主要的信号源如下: 异常:进程运行过程中出现异常; 其它进程:一个进程可以向另一个或一组进程发送信号; 终端中断:Ctrl-C,Ctrl-\等; 作业控制:前台、后台进程的管理; 分配额:CPU超时或文件大小突

文档评论(0)

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

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

1亿VIP精品文档

相关文档