进程间通信
进程间通信(IPC)
linux中实现进程间通信的几种方式:
管道
管道的特性:一边写,一边读。这边没有东西,另一端则处于阻塞状态。只有当另一端写入时,一端才能读出数据。
管道又分为几种模式:
单工:例如看电视,一端只能播放,一端只能接收,
半双工:例如对讲机,只能一端放,一端收,一个人说话,另一个人只能听。可以互相都说话。
全双工:例如打电话,两边都可以自由说或者听。
linux中一切皆文件:
管道文件的创建方式为:
int pipe(int fds[2])
fds是一个int型的数组。通过调用pipe函数,使得fds的两个值分别为文件描述符的值,这些文件描述符直接映射到对应的管道文件。fds[0]为管道输入端,fds[1]为管道的输出端。
我们可以通过fork子进程的方式来操作管道。
fork时,子进程继承父进程的所有数据,同时也复制出了管道文件描述符,因此我们可以在子进程中输入,输入的话我们将子进程中对应的读文件描述符关闭fds[0]。相对应的,我们将父进程的写文件描述符也关闭fds[1]。
创建管道文件函数:
int mkfifo(const char *name,mode_t mode);
打开管道文件
int fd = open(name, O_RDONLY); 管道一边写一边读;
int fd = open(name, O_WONLY); 只写
消息队列
创建消息队列:
msgget(key_t key, int flags);
key相当于文件名,
创建消息队列: IPC_CREAT | 0644
对应权限 直接或上去, 如果只是想打开 直接填0,否则填错权限