管道及其简单实现

管道

管道也叫管道文件,是文件的一种。其中分为有名管道和无名管道,有名管道:可以在任意两个进程间通信;无名管道:只能在父子进程间通信。管道的通信方式是半双工的,那么什么是半双工呢?就像收音机、打印机一样。那既然有半双工,当然也会有全双工,全双工就向电话一样双方都可以进行通话。
管道分为读端和写端,顾名思义,写端就是向管道中写入数据,读端就是向管道中读取数据。

有名管道

首先我们通过mkfifo fifo来创建一个管道,接着我们分别创建出读端和写端。
对文件进行进行操作的方法有三种,它们分别是:O_EDONLY只读 O_WRONLY只写 O_EDWR读写(注意,在管道中是没有读写操作的,因为它是一个半双工的模式)
我们用open函数来打开管道,它的头文件是#include <fcntl.h>,函数原型如下:
int open(const char pathname, int flags);//已经创建好了管道
int open(const char pathname, int flags, mode_t mode);//全新创建管道

流程大概如下:
1.我们定义一个整形变量来接受它的返回值,我们知道0(标准输入),1(标准输出),2(标准错误输出)已经被占用,所以理论上它的返回值为3
2.当返回值为-1时,出错
3.我们定义一个信号
SIGPIPE**,当触发这个信号时,我们调用fun函数来打印错误
当给一个已经关闭的文件中写入数据时,会产生一个SIGPIPE信号,默认终止程序
4.定义一个足够大的数组并初始化为0,从键盘上获取到的字符都写入到buff中
5.将buff中的字符写入到文件中,并做判断当输入的字符是"end"时,跳出
6.关闭文件描述符并退出程序
代码如下:

void fun(int sig)
{
   
	printf("收到SIGPIPE\n");
}
int main()
{
   
	int fd=open ("fifo",O_WRONLY);     //管道有只读和只写权限,读写权限没有定义
	printf("fd=%d\n",fd);              
	if(fd == -1 )
	{
   
		return 0;
	}
	signal(SIGPIPE,fun);//当给一个已经关闭的socket中写入数据时,会产生一个SIGPIPE信号,默认终止程序
	while(
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值