Linux进程间通信——匿名管道

        管道是UNIX系统中最古老的进程间通信技术,古老意味着所有系统都支持,早期的管道是半双工通信,现有的系统管道是全双工通信;管道就是一种特殊的文件,数据在文件中是流动的,读取之后就自动消失,如果文件中没有数据则会阻塞。本章咱们就细讲匿名管道。

匿名管道和我们之前讲的有名管道还是有很大不同,它只适合通过 fork 创建父子进程之间使用。那既然是父子进程之间通信,那么就不需要两个文件来创建进程了,这里利用 fork 在.c 文件中分裂出父子进程即可实现;基本思路就是:父进程获取一对存放读写权限的fd,然后创建出子进程,父进程不需要读数据,即关闭读fd,写完数据后再关闭写;在子进程中会共享父进程的fd,子进程只需要读数据,先关闭写fd,读出数据后关闭读即可完成一次通信。详见如下代码:

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>

int main(int argc,const char* argv[])
{
	int fd[2];
	//获取匿名管道的fd
	if(pipe(fd))
	{
		perror("pipe");
		return -1;
	}

	if(fork())
	{
		//父进程 负责写 关闭读
		close(fd[0]);
		while(1)
		{
			char buf[256];
			printf(">>>>>");
			scanf("%s",buf);
			write(fd[1],buf,sizeof(buf));
			if(0==strcmp("quit",buf))
			{
				printf("通信结束!\n");
				break;
			}
			usleep(5000);
		}
		close(fd[1]);
	}
	else
	{
		close(fd[1]);
		while(1)
		{
			char buf[256];
			read(fd[0],buf,sizeof(buf));
			printf("%s\n",buf);
			if(0==strcmp("quit",buf))
			{
				printf("通信结束!\n");
				break;
			}
		}
		close(fd[0]);
	}
		
	return 0;
}

over

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值