栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

Linux-进程间通信-无名管道2

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Linux-进程间通信-无名管道2

0、章节引用 1、课堂目标
  • 无名管道读特性(熟练)
  • 无名管道写特性(熟练)
  • 小结
2、读取无名管道
  • 写端存在(至少有一个进程存在写端的文件描述符)的情况
  • 1、管道内有数据时,read读取会返回实际读取的字节数。
  • 2、管道内无数据时,read会读堵塞。
  • 写端不存在(所有进程都关闭写端文件描述符)
  • 1、管道内有数据时,read读取会返回实际读取的字节数。
  • 2、管道内无数据时,read会返回0。
  • 注意:一般情况写入数据后会关闭写端,读端可以根据read返回的数据判断写端是否结束。
3、读端存在
  • 读端存在(至少有一个进程存在读端的文件描述符)的情况
  • 1、管道中有足够的空间时,write会返回实际写入的字节数
  • 2、管道中空间不足时,写入数据会先占满管道,之后的数据由于没有空间会等待写入,导致write堵塞,直到有空间将数据全部写入管道。
  • 读端不存在(所有进程都关闭读端的文件描述符)的情况
  • 1、不管是有空间。都会导致管道断裂,无法写入成功,会被信号13退出进程。
4、无名管道- 思考
  • 如何获取无名管道的大小?
  • 循环写入管道,直到堵塞,统计循环的次数。
#include
#include
#include
#include

int main(void)
{
    
	int count = 0;
	int pfd[2];
	char buf[1024];
	memset(buf,0x0,sizeof(buf));
		
    if(pipe(pfd)<0)//创建管道
    {
        perror("pipe");
        exit(-1);
    }
    while(1)
    {
		if(write(pfd[1],buf,1024)!= -1)	//写入1k
        {
        	count++;
        	printf("times = %dn",count);//打印写入的次数
        }   
    }

    return 0;
}
  • 运行结果:
times = 1
times = 2
...(省略中间信息)
times = 63
times = 64
(等待写入成功)
5、无名管道- 思考2
  • 如何验证管道断裂(进程被信号结束)?
  • 通过父进程关闭读端,之后子进程写入管道,父进程回收子进程的结束状态,查看是否为信号结束。
#include
#include
#include
#include
#include
#include

int main(void)
{
    
	int pfd[2];
	int status;
	char buf[32];
	pid_t pid;
	strcpy(buf,"123123123");
	
    if(pipe(pfd)<0)//创建管道
    {
        perror("pipe");
        exit(-1);
    }
    close(pfd[0]);//提前关闭读端
    if((pid = fork())<0)
    {
    	perror("fork");
    	exit(-1);
    }
    else if(pid == 0)
    {
    	sleep(1);
    	write(pfd[1],buf,32);//子进程写管道
    	printf("123123123n");//结果并没有打印
    }
    else
    {
    	wait(&status);//等待子进程结束
    	printf("status = %xn",status);
    }

    return 0;
}
  • 运行结果:status = d
6、无名管道小结
  • 无名管道读特性(写端存在,无数据时读数据堵塞,)
  • 无名管道写特性(读端存在,没有空间,写端会堵塞。没有读端时会断裂,进程结束)
欢迎关注微信工作号,推送文章更及时。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/338748.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号