linux中进程间如何通信的?

时间:2021-07-25 04:35:35

因为进程和线程不一样,他们各自的地址空间不同,互不干扰,主要有以下通信方式。

1,共享内存:进程可以将同一段共享内存连接到它们自己的地址空间中,所有进程都可以访问共享内存中的地址,当然会产生竞争条件,所以需要同步(例如使用喜好量),这种情况同样适用于线程。

2,信号量:你作为同步的一种办法,当然也算是通信的一种了,因为多个进程共同依靠信号量来改变自己的状态,例如一个只保存0,1的信号量,一个进程进入临界区执行P(sv)信号量减1为0,另一个进程会因为信号量为0而挂起,当前一个进程离开了临界区的时候,后一个进程恢复运行,两个进程都执行完了后没有进程等待(挂起)就执行V(sv)加一

3,(匿名)管道:单向的、先进先出的、无结构的、固定大小的字节流,用于不同进程的通信,例如:

ls -l | grep string
|就是管道,进程ls向屏幕的标准输出重定向到grep进程的输入,其中管道空的读进程阻塞,管道满时写进程阻塞。

4,(命名)管道:也就是FIFO(先进先出)这点和匿名管道类似,不同在于命名管道是即可以读也可以写的。。

5,消息队列:和管道类似,在系统内核中是以消息链表的形式出现。

6,套接字:socket,即套接字是一种通信机制,凭借这种机制,客户/服务器(即要进行通信的进程)系统的开发工作既可以在本地单机上进行,也可以跨网络进行。也就是说它可以让不在同一台计算机但通过网络连接计算机上的进程进行通信。也因为这样,套接字明确地将客户端和服务器区分开来

7,操作系统通过信号来通知某一进程发生了某一种预定好的事件;接收到信号的进程可以选择不同的方式处理该信号,一是可以采用默认处理机制-进程中断或退出,一是忽略该信号,还有就是自定义该信号的处理函数,执行相应的动作。