通过管道实现进程间通信

#include <stdio.h>
#include <unistd.h>
#define BUF_SIZE 30

int main()
{
	int fds[2];
	char str1[]="Who are you?";
	char str2[]="Thank you for your message";
	char buf[BUF_SIZE];
	pid_t pid;
	
	pipe(fds);	//fds数组中保存用于I/O的文件描述符
	pid=fork();	//复制的并非管道,而是用于管道I/O的文件描述符
	if(pid==0)		//子进程区域
	{
		write(fds[1],str1,sizeof(str1));
	//	sleep(2);	//如果注释这行代码,在第19行子进程将读回直接在第17行向管道发送的数据,结果父进程调用read函数后将无限期等待数据进入管道
		read(fds[0],buf,BUF_SIZE);		//这里的buf数组和父进程的buf数组不是同一个
		printf("Child proc output: %s \n",buf);
		
	}
	else
	{
		read(fds[0],buf,BUF_SIZE);
		printf("Parent proc output: %s \n",buf);
		write(fds[1],str2,sizeof(str2));
		//sleep(3);	//如果注释这行代码,父进程先终止(会销毁处于僵尸状态的子进程)会弹出命令提示符,这时子进程仍在工作,故不会产生问题。
	}
	return 0;
}


#include <stdio.h>
#include <unistd.h>
#define BUF_SIZE 30
int main()
{
	
	char str1[]="Who are you?";
	char str2[]="Thank you for your message";
	char buf[BUF_SIZE];
	int fds1[2],fds2[2];
	pipe(fds1),pipe(fds2);
	
	pid_t pid=fork();
	if(pid==0)
	{
		write(fds1[1],str1,sizeof(str1));
		read(fds2[0],buf,BUF_SIZE);
		printf("Message from parent:%s\n",buf);		
	}
	else
	{
		read(fds1[0],buf,BUF_SIZE);
		printf("Message from child:%s\n",buf);
		write(fds2[1],str2,sizeof(str2));
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值