进程间通信
在两个进程之间,每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到。比如,在父进程中的全局变量,如果在子进程中去改变这个全局变量,则子进程中被改变的这个值不会去影响父进程,因为子进程中的所有数据都是通过写时拷贝拷自父进程的,两个进程的地址空间不同:
以代码为例:
![](https://img-blog.csdn.net/20170513170214869?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzUxMTYzNzE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
运行代码后我们可以发现:
![](https://img-blog.csdn.net/20170513170320166?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzUxMTYzNzE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
父进程和子进程之间并没有共享数据,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓 冲区,进程2再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信。
进程间通信——管道通信
管道是一种最基本的IPC机制,有pipe函数创建,pipe的基本格式为int pipe(int fds[2]);
调用pipe函数时在内核中开辟一块缓冲区(称为管道)用于通信,它有一个读端一个写端,然后通过fds参数传出给用户程序两个文件描述符,filedes[0]指向管道的读端,filedes[1]指向管道的写端(很好记,就像0是标准输入1是标准输出一样)。所以管道在用户程序看起来就像一个打开的文件,通过read(fds[0]);或者write(fds[1]);向这个文件读写数据其实是在读写内核缓冲区。pipe函数调用成功返回0,调用失败返回-1