匿名管道中的 半双工管道(pipe)

创建管道:

int pipe(int filedes[2]);
参数:
filedes【1】:
filedes【2】:
PS:
小口诀:零度以下(0读1写)。
返回值:
-1--------失败
0 ---------成功

关闭管道:

close(filedes);
PS:
要把两个管道都关闭,即创建一次,关闭两次:
close(fb【0】);close(fb【1】);

写操作:

ssize_t write(int fd,   count void* buf,   size_t nbyte);
参数:
fd:
文件描述符。
buf:
写入数据的内存单元。
nbyte:
写入文件指定的字节数。
返回值:
-1-------出错
正数----写入的字节数

读操作:

ssize_t read(int fd,  void* buf, size_t count);
参数:
fb:
文件描述符。
buf:
读取数据的内存单元
count:
读取文件指定的字节数
返回值:
-1-----出错
0------无数据
正数---读取的字节数

控制:

如果管道是空的,read()默认是阻塞。想要变成非阻塞,需要修改系统参数。
int fcntl(int fd,  int cmd,  long arg);
参数:
fd:
文件描述符。
cmd:
F_GETFL获取文件描述符状态
F_SETFL设置文件描述符状态
..............................................
arg:
O_NONBLOCK非阻塞
O_BLOCK阻塞
...............................
把文件描述符设置为非阻塞命令:
fcntl(filedes,  F_SETFL,  O_NONB;OCK);

代码图示:


代码示范:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>

int main(){
	int fd[2];
	pipe(fd);
	if(!fork()){// child
		close(fd[0]);
		char in[] = "Hello pipe";
		sleep(3);//等待3S
		write(fd[1],in,sizeof(in));
		printf("child %d write:%s\n",getpid(),in);
		close(fd[1]);
	}else{// parent
		close(fd[1]);
//		fcntl(fd[0],F_SETFL,O_NONBLOCK);//设置为非阻塞
		char out[BUFSIZ]={0};
		ssize_t n = read(fd[0],out,sizeof(out));
		if(-1 == n){
			perror("read error");
			return -1;
		}
		printf("parent %d read:%s\n",getpid(),out);
		close(fd[0]);
	}
}

结果:

3S后出现:

结果显示:
在不设置非阻塞的情况下:读操作会阻塞,必须先写或同时读写才能继续执行下面的程序(子进程中3秒睡眠的时候父进程处于阻塞状态,等待子进程写入)。
在设置非阻塞的情况下:父进程不等子进程写入就开始读取,结果没有读到信息。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值