简单介绍了进程间通信的基本概念
进程间通信的方法
pipe, fifo, message queue, semaphores, shared memory
pipe
- pipe的限制
pipe是最常用的进程间通信方法,但有两条限制:
- 一个pipe只支持单向通信,如果需要双向通信,需要创建2个pipe,当然现在有些Unix系
统是支持双向通信 - pipe只能用于两个有共同祖先的进程之间,一般是父进程和子进程之间
- pipe的创建函数
#include<unistd.h>
int pipe(int fd[2]);
创建成功后,fd
数组就包含了2个文件描述符,文件描述符的使用方法和打开普通文件后
得到的文件描述符一样。
区别是fd[0]
只能用于读取,fd[1]
只能用于写入,fd[1]
写入的字符串会被fd[0]
读取,数据流过程如下:
fd[1]写入 ---> pipe(kernel) ---> fd[0]读取
- 例子
下面的简单例子展示了父进程和子进程之间的通信,父进程向子进程通过pipe传递了字符串
hello world
#include<stdio.h>
#include<unistd.h>
int main(int argc, char *argv[])
{
int n;
int fd[2];
pid_t pid;
char line[100];
if (pipe(fd) < 0){
printf("fail to pipe.\n");
return 1;
}
if ((pid = fork()) < 0){
printf("fail to fork.\n");
return 1;
}
if (pid > 0){ /* parent*/
close(fd[0]);
write(fd[1], "hello world\n", 12);
} else { /* child */
close(fd[1]);
n = read(fd[0], line, 100);
printf("%s", line);
}
}
其他通信方法
- fifo突破了pipe的2点限制,可以双向的在不相关的线程间通信
- messagequeue是内核保存的一个消息队列,一个进程可以往里添加消息,另一个线程可
以读取里面的消息 - semaphore不是线程之间传递数据的机制,而是一个计数器,可以对多个进程共享的资源
提供保护机制,可以用来实现锁的功能 - shared memory,多个进程之间共享内存,是最快速的进程间通信方式