无名管道
它只能用于具有亲缘关系的进程之间的通信(也就是父子进程或者兄弟进程之间)
它是一个半双工的通信模式,具有固定的读端和写端
管道也可以看成是一种特殊的文件,对于它的读写也可以使用普通的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