Linux——进程间通信的常见方法(管道、信号、共享映射区、本地套接字)、管道的了解与简单用法

进程间通信IPC的原理:
在这里插入图片描述
在这里插入图片描述
常见的进程间通信方式有:

  1. 管道(使用最简单)
  2. 信号(开销最小)
  3. 共享映射区(无血缘关系)
  4. 本地套接字(最稳定)

二、管道的特质与基本用法

内核借助环形队列机制,使用内核缓冲区实现,血缘关系间进程可用
在这里插入图片描述
创建并打开管道:int pipe(int pipefd[2]);参数分别是读写,pipefd[0]是读端,pipefd[1]是写端,成功返回0,失败返回-1
例子:创建管道时父子进程的读写通道都打开,那么fork子进程后,子进程也拥有父进程的读写通道,如图
在这里插入图片描述
但是管道数据是单向流动的,因此一端读的话一端写,我们就将父进程的读端关闭,将子进程的写端关闭:
在这里插入图片描述

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<unistd.h>
#include<pthread.h>

void sys_err(const char *str)
{
	perror(str);
	exit(1);
}
int main(int argc, char *argv[])
{
	int ret;//接收创建管道的函数的返回值
	int fd[2];
	char *str = "hello pipe"
	char buf[1024];
	ret = pipe(fd);
	if(ret == -1)
		sys_err("pipe error");
	pid = fork();//创建子进程
	if(pid>0)//父进程
	{
		close(fd[0]);//父进程关闭读端
		write(fd[1],str, strlen(str));//父进程往管道中写数据
		close(fd[1]);
		
	}else(pid == 0)//子进程
	{
		close(fd[1]);//子进程关闭写端
		//子进程去读
		ret = read(fd[0], buf, sizeof(buf));
		write(STDOUT_FILENO, buf, ret);
		close(fd[0]);
	}
}

三、管道的读写行为

在这里插入图片描述

原创文章 119 获赞 27 访问量 5996

猜你喜欢

转载自blog.csdn.net/qq_37299596/article/details/105853851