linux管道

匿名管道:
  pipe
  #include <unistd.h>
       int pipe(
       int filedes[2]); 
       1.创建描述符数组
       2.把描述符数组变成管道
       3.创建父子进程
       4.父子进程分别读写描述符号。
#include <unistd.h>
#include <string.h>

int main(){
	int fds[2];
	pipe(fds);//创建管道

	if(fork()){
		char i = '0';
		while(1){
			write(fds[1],&i,1);//往管道写端写入数据
			i++;
			sleep(1);
		}	
	}else{
		char i;
		int r;
		while(1){
			r = read(fds[0],&i,1);//阻塞函数,一定要读到数据才返回。
			if(r>0)
				write(0,&i,1);//打印到终端
			else
				write(0,"没收到",strlen("没收到")+1);
		}
	}

}
有名管道:
     创建一个管道文件,两个进程都可以访问这个文件,并通过文件进行通信,比普通文件高级的地方在于,这个文件可看做一个队列,有序。  
    编程模型
     A         B
    创建管道 mkfifo
    打开管道 open      打开管道
    使用管道 read/write    使用管道
    关闭管道 close     关闭管道
    删除管道 unlink system("rm");

    数据无边界 有序 收发同步
接收
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
int main(){
	char name[20] = "first.pipe";
	int r;
	int fd;
	char buff[256];
	//1 创建管道文件
	r = mkfifo(name,0666);
	if(-1 == r) printf("mkfifo error:%m\n"),exit(-1);
	printf("mkfifo %m\n");
	//2 打开管道
	fd = open(name,O_RDONLY);
	if(-1 == fd) printf("open error:%m\n"),unlink(name),exit(-1);
	printf("open %m\n");
	//3 读管道
	while(1){
		r = read(fd,buff,sizeof(buff)-1);
		if(r > 0){
			buff[r] = 0;
			printf(">>>%s\n",buff);
		}
	}
	return 0;
}
发送
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
int main(){
	char name[20] = "~/first.pipe";
	int fd;
	int r;
	char buff[256];
	fd = open("/root/first.pipe",O_WRONLY);
	if(-1 == fd) printf("open error:%m\n"),unlink(name),exit(-1);
	printf("open %m\n");
	while(1){
		r = read(0,buff,256);
		if(r > 0){
			write(fd,buff,r);
		}
	}
	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值