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

Linux-进程间通信-有名管道1

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

Linux-进程间通信-有名管道1

1、课堂目标:
  • 有名管道特点(了解)
  • 有名管道创建(熟练)
  • 有名管道读写(熟练)
  • 小结
2、有名管道特点
  • 有名管道的特点:
  • 1、有名管道创建后有对应文件(p),可以在任意进程间通信。
  • 2、打开管道时可以指定读写方式,会根据读写方式返回对应的读端和写端文件描述符
  • 3、通过文件io操作,但内容存放在内存中,所以管道文件大小为0。当读端和写端都关闭后,管道中的内存就不存在了。
3、有名管道创建-mkfifo
#include 
#include 
int mkfifo(const char *pathname, mode_t mode);
  • 成功返回0,失败返回EOF
  • pathname创建的管道文件路径,没有路径代表当前路径
  • mode管道的文件权限三个8进制数,由于管道不可执行,所有一般指定读写权限。
  • 当创建完成管道后,先创建读端,读端的open函数会堵塞,直到写端被打开。
  • 当创建完成管道并创建读写端后,写端关闭,读端会返回0。
4、有名管道读写-示例
  • 进程A:循环从键盘输入并写入有名管道,输入quit时退出。
  • 进程B:循环统计进程A每次打印写入管道的字符串内容和长度
#include 
#include 
#include 
#include 
#include 
#include 
#include 


#define N	32

int main(void)
{
	
	char buf[N];
	int pfd;
	char (*w_buf)[32];
	
	//首次执行时打开
	//新建有名管道
	
	
	
	//打开写端
	if((pfd = open("myfifo",O_WRONLY))<0)
	{
		perror("open");
		exit(-1);
	}

	//循环从屏幕中获取写入
	while(1)
	{
		w_buf = fgets(buf,N,stdin);//长度比数据多1,因为fgets接收了n
		if(strcmp(buf,"quitn") == 0)//所以对比的时候需要对比n
		{
			break;
		}
		printf("write_data = %s",*w_buf);
		write(pfd,buf,N);	
		memset(buf,0x0,sizeof(buf));		
	}	
	close(pfd);	
	return 0;	
}
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#define N	32
int main(void)
{
	
	char buf[N];
	int pfd;
	//打开读端
	if((pfd = open("myfifo",O_RDONLY))<0)
	{
		perror("open");
		exit(-1);
	}	
	//循环从管道中获取,打印数据
	while(read(pfd,buf,N)>0)
	{
		printf("buf = %s",buf);	
		printf("len = %dn",strlen(buf));//长度比数据多1,因为fgets接收了n
		memset(buf,0x0,strlen(buf));	

	}	
	close(pfd);		

	return 0;	
}

5、有名管道小结
  • 有名管道特点
  • mkfifo
  • 有名管道打开会堵塞(创建管道后,只有打开一端后会堵塞,当读写两端都打开后会继续运行)
欢迎关注微信工作号,推送文章更及时。

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

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

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