进程间通信:
每个人进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓存区,进程1将数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把数据读走,内核提供的这种机制叫做进程间通信(IPC)。
管道:
一种最基本的IPC机制,由pipe函数创建。
#include
int pipe(int filedes[2]);
调用pipe函数时在内核中开辟一块缓冲区(管道)用于通信,它有一个读端一个写端,通过filedes参数传出给用户程序两个文件描述符,filedes[0]表示指向管道的读端,filedes[1]表示指向管道的写端。所以管道在用户程序看起来就像打开文件一样,通过read(filedes[0])或者write(filedes[1]);向这个文件读写数据其实是在读写内核缓冲区。pipe函数调用成功返回0;失败返回-1.
管道通信的一般想法:
1、父进程调用pipe开辟管道,得到两个文件描述符指向管道的两端。
2、父进程调用fork创建子进程,那么子进程也用两个文件描述符指向同一个管道。
3、父进程关闭管道读端,子进程关闭管道写端。父进程向管道写,子进程向管道读,这样就可以实现坚持间通信。
管道的限制:
两个进程通过一个管道只能实现单向通信。
如果希望双向通信可以再开辟一个管道。
管道的读写端通过打开的文件描述符来传递,因此要通信的两个进程必须从他们大的公共祖先那里继承管道文件描述符。管道通信需要进程之间有关系。
使用管道需
本文介绍了Linux进程间通信(IPC)的基本概念,强调了进程间全局变量无法直接共享,并详细讲解了管道通信的工作原理、使用步骤及限制。管道提供单向通信,且需要进程间有关系。命名管道(FIFO)则是一个存储在硬盘上的设备文件,允许不相关的进程通过指定路径进行通信。
最低0.47元/天 解锁文章
2358

被折叠的 条评论
为什么被折叠?



