进程间通信

1.概念

    每个进程各自有不同的进程地址空间,任何一个进程的全局变量在另一个进程中都不能访问,所以进程之间要交换数据必须通过内核。在内核中开辟一块缓冲区,P1进程把数据从用户空间考到内核缓冲区,P2进程再从内核缓冲区把数据读走。这种机制就叫做进程间的通信。

2.通信的方法:  信号(signal)  管道(pipe) 套接字(socket)和System V IPC机制。

   2.1信号

     它是linux系统进程之间相互通信或者操作的一种机制。信号可以在任何时候发给某一个进程,而无需知道该进程的状态。如果该进程当前未处于执行状态,则该信号就有内核保存起来,直达该进程恢复执行并传递消息给它为止,如果在一个信号被进程设置为阻塞,则该信号的传递被延迟,直到其阻塞被取消时才被传递给进程。

 信号是在软件层次上对终端机制的一种模拟,是一种异步通信方式。信号可以再用户空间进程和内核之间直接交互,内核也可以利用信号来通知用户空间的进程发生了那些系统事件。信号事件的发生有一下两个来源:

    1.硬件来源:如按下了<Ctrl>+C键,通常产生终端信号(SIGINT)。

    2.软件来源:如使用系统调用或者使命令发出信号。最常用的发送信号的系统函数是kill,raise,alarm,setitimer,sigation和sigqueue函数,软件来源还包括一些非法运算等操作。


    2.2管道(pipe)

      管道允许在进程之间按先进先出的方式传送数据,是进程间通信的一种常见的方式。

      管道分为pipe(无名管道)和FIFO(命名管道)两种。除了建立,打开,删除的方式不用外,这两种管道几乎都是一样的。他们都是通过内核缓冲区实现数据传输。

      pipe:用于相关进程通信,进程只能访问自己或者祖先创建的管道,而不能任意访问已经存在的管道-----因为没有名字。它通过pipe()系统调用来创建并打开,当最后一个使用他的进程关闭对它的引用时,pipe将自动撤销。

      

      FIFO:它与无名管道工作机制很类似,都是采用对打开的文件进行读写的方式。命名管道的名字对应于一个磁盘索引节点,有了这个文件名,任何进程有相应的权限都可以对它进行访问。使用open()函数通过文件名可以打开已经创建的命名管道,而无名管道不能有open()打开。当一个命名管道不在被任何进程打开时,它并没有消失,还可以在次被打开,就像打开一个磁盘文件一样。可以用删除普通文件的方法将其删除,实际删除的是磁盘上对应的节点信息。

     高级管道操作:在Linux C程序设计中除了应用常用的pipe系统调用建立管道外,还可以使用C函数库中管道函数popen()和pclose()来实现。







  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值