<进程间通信>无名管道PIPE

前言

提示:本篇主要是本小白对Linux 无名管道一些笔记,希望对一同学习Linux的伙伴有所帮助。
如有发现错误,欢迎指出,一同进步!


提示:以下是本篇文章正文内容,下面案例可供参考
加粗样式

一、进程间管道通讯

无名管道PIPE(仅在内存中存在,文件系统不可见)

无名(有名)管道:管道是一种进程间通信机制,好比一个管子,一边一个口,一个往里放,另一头可以往出取,操作是双向的

无名管道特点:只能用于有亲缘关系的近缘之间的通信
		   	 单工的通信模式,具有固定的读端和写段
			 无名管道创建时会返回两个文件描述符,分别用于读写管道

二、使用步骤

1.引入库

#include <unistd.h>

	int pipe2(int pipefd[2], int flags);(暂时没了解)
    int pipe(int pipefd[2]);
    成功时返回0,失败时返回EOF(-1);
    pipefd包含两个元素得整形数组,用来保存文件描述符
    pipefd[0]用于读管道,pipefd[1]用于写管道

代码如下(示例):

##包含所需头文件
#include<stdio.h>
#include<unistd.h>
#include<string.h>
#include<stdlib.h>


## 2.正文代码段
代码如下(示例):

int main(void)
{
		int pd[2]; 
		int fd; //定义一个文件描述符为整型类型
		char *buf="hello world";//缓冲区的内容
	
		if(pipe(pd)==-1)//判断开辟管道是否成功
		{
				perror("pipe");
		}
		fd = fork();//创建子进程
		if(fd==-1)//判断子进程是否创建成功
		{
		perror("fork");
		}
		else if(fd ==0)//子进程
		{
				printf("This is child pipe\n");
				close(pd[1]);//关闭写端
				read(pd[0],buf,1024);//读管道:将管道中的内容都到缓冲区
				printf("get from father:%s\n",buf);//打印从管道读取到的内容
				exit(0);//退出
		}
		else if(fd >0)//父进程
		{
				printf("This is father pipe\n");
				close(pd[0]);//关闭读端
				write(pd[1],buf,strlen(buf));//写管道:将缓冲区的内容写入管道
				wait(NULL);//等待子进程结束
		}

		return 0;
}


# 读写管道注意(先创建无名管道,再创建子进程)
	
	读无名管道
	1.当写端存在
		管道内有数据 	read返回实际读取的字节数
		管道内无数据 	进程堵塞
	2.当写段不存在
		管道内有数据		read返回实际读取的字节数
		管道内无数据		read返回0
	写无名管道
	1.当读端存在
		有空间  	 write返回实际写入的字节数	
		无空间  	     进程堵塞
	2.读读端不存在
		有空间 		管道破裂(SIGPIPE)
		无空间		管道破裂(SIGPIPE)
		
如何获取无名管道的大小:
①循环写入管道,直到堵塞
②统计循环次数
Linux 无名管道(默认)大小为64个字节(64k)

查看所有信号表:kill -l
管道破裂signal:SIGPIPE

如何验证管道破裂(进程被信号结束)
①子进程写管道
②父进程回收
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值