linux系统编程——管道pipe

管道pipe

内核中的缓冲区,多数使用队列(数据结构)来实现的。而队列多采用环形队列,一般采用阻塞机制,还有另一种机制是覆盖机制(当队列满的时候,后入队的覆盖之前的数据)。

 

下边例1 完成的功能就是 父进程向管道中写数据,子进程读父进程写的数据。

——例1

/*************************************************************************
	> Created Time: 2016年08月08日 星期一 17时37分47秒
 ************************************************************************/
#include <stdio.h>#include <unistd.h>#include <string.h>#include <stdlib.h>
#include <sys/wait.h>
int main(void)
{
	int fd[2];
	char str[1024] = "hello xuxing";
	char buf[1024];
	pid_t pid;
	//fd[0] 读数据端
	//fd[1] 写数据端
	if(pipe(fd) < 0) {
		/* 错误日志 */
		perror("pipe");
		exit(1);
	}
	pid = fork();
	//父写子读
	if(pid > 0) {
		//父进程里边,关闭父读
		close(fd[0]);
		write(fd[1], str, strlen(str));
		sleep(3);
		wait(NULL);
	}
	else if (pid == 0) {
		//子进程里边,关闭子写
		int len;
		close(fd[1]);
		len = read(fd[0], buf, sizeof(buf));
		sprintf(str, "child %s\n", buf);
		write(STDOUT_FILENO, buf, len);
	}
	else {
		perror("fork");
		exit(1);
	}
	return 0;
}

##重要图解——pipe





注意:

一定是先创建管道,之后在fork进程。

 

重要知识点

管道的读写端通过打开的文件描述符来传递,因此要通信的两个进程必须从共同祖先哪里继承管道文件描述符。上边的例子是父进程把文件描述符传给子进程,也可以父进程fork两次,把文件描述符传递给两个子进程,然后两个子进程之间通信,总之需要通过fork传递文件描述符使得两个进程都能同时访问同一个管道。

使用管道需要注意一下4种特殊情况(假设都是阻塞I/O操作)

1、 所有指向管道的写端的文件描述符都关闭了

2、 如果有指向管道写端的文件描述符没有关闭(管道写端的引用计数大于0),管道写端的进程也没有向管道中写数据,这时候有进程从管道读端读数据,那么管道数据被读取后,再次read会阻塞

3、 所有指向管道读端的文件描述符都关闭了(管道引用计数等于0),这时候有进程向管道写端write,那么进程会受到信号SIGPIPE,通常会导致进程终止

4、 如果有指向管道读端的文件描述符,没有关闭(管道读端引用计数大于0)管道读端的进程也没有从管道中读数据,这时候有进程向管道写端写数据,那么write会发生阻塞,知道管道中有了空位置才写入数据比并返回。

——例2

计算一个管道pipe缓冲区的大小


#include <stdio.h>#include <unistd.h>
int main(void)
{
	int fd[2];
	pipe(fd);
	printf("pipe buf %ld\n", fpathconf(fd[0], _PC_PIPE_BUF));
	printf("%ld\n", fpathconf(STDOUT_FILENO, _PC_NAME_MAX));
	printf("%ld\n", pathconf("hello", _PC_NAME_MAX));
	return 0;
}



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值