前言
提示:本篇主要是本小白对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
如何验证管道破裂(进程被信号结束)
①子进程写管道
②父进程回收