进程间通信的方式有管道、命名管道、信号、消息队列、共享内存、信号量、socket共7种。
一、管道(使用最简单)
int pipe(fd[2]);
fd[0]->r, fd[1]->r
1.管道是半双工的,双方需要通信时,需要建立两个管道。
2.管道的实质是一个内核缓冲区,进程以先进先出的方式从缓冲区存取数据。
3.该内核缓冲区可以看做是一个循环队列。缓冲区里的数据只能被读一次,读过之后就不复存在。
4.当管道为空时,读阻塞,当管道为满时,写阻塞。
5.只能用于有血缘关系的进程间通信。
二、有名管道
mkfifo
1.原理类似于管道,不同的是会创建实际的管道类型文件‘p’,这样无血缘关系的进程也可进行通信。
三、信号(开销最小)
1.信号是Linux系统中用于进程之间通信或操作的一种机制,信号可以在任何时候发送给某一进程,而无须知道该进程的状态。如果该进程并未处于执行状态,则该信号就由内核保存起来,知道该进程恢复执行并传递给他为止。如果一个信号被进程设置为阻塞,则该信号的传递被延迟,直到其阻塞被取消时才被传递给进程。
四、消息队列
1.消息队列的本质就是由内核创建的用于存放消息的链表,由于是存放消息的,所以就把这个链表称为消息队列。
2.通信的进程通过共享同一个消息队列,就能实现进程间通信。
3.消息队列这个链表有很多节点,链表上每一个节点就是一个消息。每个消息由两部分组成,分别是消息编号(消息类型)和消息正文。
消息编号:识别消息用;消息正文:真正的信息内容。
4.消息队列与管道通信相比,其优势是对每个消息指定特定的消息类型,接收的时候不需要按照队列次序,而是可以根据自定义条件接收特定类型的消息。
五、共享内存
1.共享内存允许两个或多个进程共享一个给定的存储区,这一段存储区可以被两个或两个以上的进程映射至自身的地址空间中,就像由malloc()分配的内存一样使用。
2.使用共享内存通信时,进程是直接使用地址来共享读写的,而不需要调用read、write等函数。
3.一个进程写入共享内存的信息,可以被其他使用这个共享内存的进程,通过一个简单的内存读取读出,从而实现了进程间的通信。
4.共享内存的效率最高,缺点是没有提供同步机制,需要使用锁等其他机制进行同步。
六、信号量
1.当多个进程/线程进行共享操作时,用于资源保护,以防止出现相互干扰的情况,说白了就是用于“资源保护”。
2.信号量实现互斥:简单理解的话,信号量其实是OS创建的一个共享变量,进程在进行操作之前,会先检查这个变量的值,这个变量的值就是一个标记,通过这个标记就可以知道可不可以操作,以实现互斥。
3.信号量是一个计数器,可以用来控制多个进程对共享资源的访问。信号量只有等待和发送两种操作。等待(P(sv))就是将其值减一或者挂起进程,发送(V(sv))就是将其值加一或者将进程恢复运行。
4.信号量的初值,决定了占用信号量的线程的个数。
七、socket
用的太多了,不说了
进程间通信
最新推荐文章于 2025-01-07 22:23:12 发布