进程间通信API

无名管道

它只能用于具有亲缘关系的进程之间的通信(也就是父子进程或者兄弟进程之间)

它是一个半双工的通信模式,具有固定的读端和写端

管道也可以看成是一种特殊的文件,对于它的读写也可以使用普通的read、write等函数。但是它不是普通的文件,并不属于其他任何文件系统,并且只存在于内存中。

 

有名管道

它可以使互不相关的两个进程实现彼此通信

该管道可以通过路径名来指出,并且在文件系统中是可见的。在建立了管道之后,两个进程就可以把它当作普通文件一样进行读写操作。

FIFO严格地遵循先进先出规则,对管道及FIFO的读总是从开始处返回数据,对它们的写则把数据添加到末尾,它们不支持如lseek()等文件定位操作。

 

有名管道的创建可以使用函数mkfifo,该函数类似文件中的open操作,可以指定管道的路径和打开的模式。

由于普通文件的读写时不会出现阻塞问题,而在管道的读写中却有阻塞的可能,这里的非阻塞标志可以在open函数中设定为O_NONBLOCK。

 

 

信号通信

signal函数

kill函数可以发送信号给进程或进程组,它不仅可以中止进程,也可以向进程发送其他信号。

与kill函数所不同的是,raise函数允许进程向自身发送信号。

alarm()和pause()

 

共享内存

共享内存的实现分为3个步骤:

1.创建共享内存,这里用到的函数为shmget,也就是从内存中获得一段共享内存区域

2.映射共享内存,也就是把这段创建的共享内存映射到具体的进程空间中去,这里使用的函数是shmat。到这里,就可以使用这段共享内存了,也就是可以使用不带缓冲的I/O读写命令对其进行操作。

3.撤销映射操作,其函数为shmdt。

 

命令ipcs,用于报告进程间通信机制状态的命令,它可以查看共享内存、消息队列等各种进程间通信机制的情况。

 

 

消息队列

创建或打开消息队列

使用函数msgget,这里创建的消息队列的数量会受到系统消息队列数量的限制

添加到消息队列

使用函数msgsnd,它把消息添加到已打开的消息队列末尾

读取消息队列内容

使用函数msgrcv,它把消息从消息队列中取走,与FIFO不同的是,这里可以指定取走某一条消息

控制消息队列

使用函数msgctl

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值