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 测试信号量值.
image
Sem_post/sem_getvalue()
image

posted @ 2026-07-29 15:28  超级麋鹿  阅读(11)  评论(0)    收藏  举报