IPC进程间通信
IPC进程间通信:信号、管道 FIFO 、消息队列、 信号量、 共享内存;
-
信号
信号可以在任何时候发送给某进程,无需知道进程状态;如果进程未处于执行态,则信号由内核保存,知道进程恢复再传递;如果信号被该进程设置未阻塞,则信号延迟传递,直到其阻塞被取消才被传递。
发送信号的函数 kill() raise() sigqueue() alarm() pause() setitimer() abort() 上述主要两个kill()sigqueue() 可以向其他进程发送信号,即Linux主要由signal()和sigaction() 实现信号处理
信号接收: linux内核task_struct中,为每个信号设置了sigaction,包含了一个信号处理函数:
![image]()
-
管道
由pipe创建简单的单路(半双工)数据流 只能用于由一个共同祖先进程的各个进程之间。
![image]()
![image]()
此外,FIFO 有名管道 不相干进程可以通过次关联,每个FIFO与一个路径名关联;后续可以使用open/write/read等io接口操作,实现进程间通信 -
消息队列
消息队列通常用例在不同进程间发送指定格式的消息数据,用法和FIFO类似 有命名、半双工
Mq_open /mq_close 创建和消除;Mq_getattr / mq_setattr 修改mq_flags属性;打开后使用 mq_send /mq_receive发送或接收消息。 -
信号量
用于提供不同进程间同步手段的原语, 进程可以对信号量的操作,创建、等待、挂出;实际使用更接近于对访问的总对象数量进行控制; 创建需要指定初始值; 等待会测试信号量的值,不大于0则阻塞等待,否则将其值减1; 挂出会将其值+1,如果恰好有被该信号量阻塞等待的进程发现在上述+1信号量为正,则进程被唤醒。
sem_opne sem_close 同样的 有命名 oflag参数包括 0 O_CREAT O_CREAT|O_EXCL mode指定权限位 value指定信号量初始值; 关闭信号量不是删除信号量, sem_unlink 从系统中释放相关资源; Sem_wait/ sem_trywait 测试信号量值.

Sem_post/sem_getvalue()

- 共享内存
共享内存是IPC形式中最快的. 一旦内存区映射到共享它的进程的地址空间,这些进程间数据的传递就不再涉及到内核(进程不在通过执行内核的系统调用来彼此传递数据)。然而往往共享内存区存放的消息或从中取走的信息的进程间需要同步。
![image]()

1027608677.png)
958813640.png)
1022817304.png)






浙公网安备 33010602011771号