传统的进程间通信方式:无名管道(pipe)、有名管道(fifo)和信号(signal)
System V IPC对象:共享内存(share memory)、消息队列(message queue)和信号灯(semaphore)
BSD:套接字(socket)
1、无名管道
无名管道只能用于具有亲缘关系的进程之间的通信。管道是基于文件描述符的通信方式,当一个管道建立时(int pipe(int fd[2])),它会创建两个文件描述符fd[0]和fd[1]。其中fd[0]固定用于读管道,而fd[1]固定用于写管道。构成一个半双工通道。
2、有名管道
有名管道可以使互不相关的两个进程互相通信。
创建管道函数int mkfifo(const char *filename,mode_t mode);
3、信号通信
发送信号 int kill(pid_t pid,int sig);
捕捉信号 int raise(int sig);
void (*signal(int signum,void(*handler)(int)))(int);//signal(SIGINT,my_func);
4、共享内存
共享内存是一种最为高效的进程间通信方式,进程可以直接读写内存,而不需要任何数据的拷贝
使用步骤:
(1)创建/打开共享内存 shmget
(2)映射共享内存,即把指定的共享内存映射到进程的地址空间用于访问 shmat
(3)撤销共享内存映射 shmdt
(4)删除共享内存对象
操作共享内存:shmctl
5、消息队列
(1)创建/打开消息队列 msgget
(2)添加消息 msgsnd
(3)读取消息 msgrcv
(4)控制消息队列 msgctl
6、信号灯
信号灯也叫信号量,它是不同进程间或一个给定进程内部不同线程间同步的机制。
System V 信号灯(semget ,semop,semget,semctl)
进程间通信方式比较
pipe:具有亲缘关系的进程间,单工,数据在内存中
fifo:可用于任意进程间,双工,有文件名,数据在内存
signal:唯一的异步通信方式
msg:常用于cs模式中,按消息类型访问,可有优先级
shm:效率最高,需要同步、互斥机制
sem:配合共享内存使用,用以实现同步和互斥
注:函数不懂请自己man - -