11.1 进程间通信的基本概念
进程间通信意味着两个不同进程间可以交换数据,为了完成这一点,操作系统中应提供两个进程可以同时访问的内存空间。
对进程间通信的基本理解
只要有两个进程可以同时访问的内存空间,就可以通过此空间交换数据。
但是,进程具有完全独立的内存结构。就连通过fork函数创建的子进程也不会与父进程共享内存空间。此时,进程间通信只能通过其他特殊方法完成。
通过管道实现进程间通信
为了完成进程间通信,需要创建管道。
管道并非属于进程的资源,而是和套接字一样,属于操作系统(也就不是fork函数的复制对象),所以,两个进程通过操作系统提供的内存空间进行通信。
父进程调用该函数时将创建管道,同时获取对应于出入口的文件描述符,此时父进程可以读写同一管道。
但父进程的目的是与子进程进行数据交换,因此需要将入口或出口中的一个文件描述符利用fork函数传递给子进程。
#include <stdio.h>
#include <unistd.h>
#define BUF_SIZE 30
int main(int argc, char *argv[]) {
int fds[2];
char str[] = "Who are you?";
char buf[BUF_SIZE];
pid_t pid;
// 调用pipe函数创建管道,fds数组中保存用于IO的文件描述符
pipe(fds);
pid = fork();
if(pid == 0) {
write(fds[1], str, sizeof(str));
} else {
read(fds[0], buf, BUF_SIZE);
puts(buf);
}
return 0;
}