进程间通信(IPC,InterProcess Communication)是指在不同进程之间传播或交换信息。IPC的方式通常有管道(包括无名管道和命名管道)、消息队列、信号量、共享存储、信号、Socket、Streams等。其中 Socket和Streams支持不同主机上的两个进程IPC
匿名管道
- 半双工
- 父子进程间通信
命名管道
是一种特殊文件,文件类型是p,存放于文件系统中
1 | anki@kong:~$ ls -l |
1 |
|
1 | const char *filename = "/home/anki/ahhh"; |
消息队列
存放在内核,由一个标识符来标识
特点
- 面向记录,具有特定格式和特定优先级
- 独立于进程,不会因进程结束而消失
- 可以FIFO,也可以随机读取
1 |
|
1 | const char *filename = "/home/anki/ahhhh"; |
信号量
- 特点
- 初始>0
- 主要用于进程间的同步/互斥,和共享内存合用可以实现进程间信息通讯
1 |
|
semop中,sembuf:
1 | struct sembuf { |
semctl中,arg:
1 |
|
cmd:
| cmd | 解释 |
| - | - |
| IPC_STAT| 从信号量集上检索semid_ds结构,并存到semun联合体参数的成员buf的地址中|
| IPC_SET| 设置一个信号量集合的semid_ds结构中ipc_perm域的值,并从semun的buf中取出值|
| IPC_RMID| 从内核中删除信号量集合|
| GETALL| 从信号量集合中获得所有信号量的值,并把其整数值存到semun联合体成员的一个指针数组中|
| GETNCNT| 返回当前等待资源的进程个数|
| GETPID| 返回最后一个执行系统调用semop()进程的PID|
| GETVAL| 返回信号量集合内单个信号量的值|
| GETZCNT| 返回当前等待100%资源利用的进程个数|
| SETALL| 与GETALL正好相反|
| SETVAL| 用联合体中val成员的值设置信号量集合中单个信号量的值|
共享内存
1 |
|