LINUX 进程通信之匿名管道
2019-07-14 10:23发布
生成海报
(一)管道的创建
管道是一种最基本的IPC机制,由pipe函数创建:
#include
int pipe ( int filedes[2] );
pipe函数需要一个形参(一个含有2个整型元素的数组),创建成功返回0,失败返回-1
该函数本质原理:
当父进程创建子进程,子进程则按照父进程的PCB进行部分拷贝形成自己的PCB。在父进程的PCB中含有一个叫做files_struct的结构,而这个结构中主要内容就是包含了该进程打开的所有文件的地址,即一个指针数组(默认情况下打开三个文件,标准输入,标准输出,标准错误,分别对应指针数组下标为0,
1, 2的元素,下标即是文件描述符)。当父进程调用pipe函数,则会在内核中开辟一块缓冲区用于通信,并且它含有一个读端一个写端,则在files_struct中多了两个元素对应着打开的文件地址在files_struct中的该管道的读端和写端,当父进程创建子进程,则files_struct也被拷贝一份到子进程的PCB,那么父子进程就看到了一份公共资源
打开的文件地址在files_struct中的规则:
改地址存放在files_struct指针数组中未使用的最小的元素中
(二)代码实现
#include
#include
#include
int main()
{
int array[2] = {0};
int key = pipe(array);
if(key < 0){
perror("pipe");
return -1;
}
pid_t ret = fork();
if(ret < 0){
// shi bai
perror("fork");
return -2;
}else if(ret == 0){
//child -> read
close(array[1]);
int count = 5;
char buf[128];
while(count--)
{
ssize_t _s = read(array[0], buf, sizeof(buf)-1);
if(_s < 0){
perror("write");
return -4;
}else{
buf[_s] = '
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮