利用管道实现两个进程的通信

代码如下

#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <errno.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
int main( )
{ 
	pid_t pid1,pid2;
	int pipe_fd[2];
	char w_buffer[100],r_buffer[100];	 
	int	len1,len2;
	/*创建一个管道*/
	if(pipe(pipe_fd)<0)
	{
		printf("pipe create error\n");
		return -1;
	}
	/*创建子进程*/
	if((pid1=fork( ))==0)	// 子进程1执行序列
	  {
		close(pipe_fd[0]);	// 子进程先关闭管道的读段
		sprintf(w_buffer,"child 1 process is sending message!"); 
		len1 = strlen(w_buffer);
		write(pipe_fd[1],w_buffer,len1);     /*向管道写长为len字节的串*/
		exit(0);
	   }
	 else if(pid1>0)	// 父进程执行序列
	  {
		waitpid(pid1,NULL,0);	// 同步1--等子进程1先写完		
		if((pid2=fork( ))==0)	// 子进程2执行序列
		{ 
			close(pipe_fd[0]);	// 子进程先关闭管道的读段
			sprintf(w_buffer,"child 2 process is sending message!");
			len2 = strlen(w_buffer);
			write(pipe_fd[1],w_buffer,len2);
			exit(0);
		 }
		 else if(pid2>0)	// 父进程执行序列
		 {  			
			waitpid(pid2,NULL,0);	// 同步2--再等子进程2写完
			close(pipe_fd[1]);	// 父进程先关闭管道的写段
			/*从管道中读固定长度字节的串*/
			if(read(pipe_fd[0],r_buffer,sizeof(r_buffer))>0)  // if(read(pipe_fd[0],r_buffer,len1)>0)
				printf("%s\n",r_buffer);
			if(read(pipe_fd[0],r_buffer,sizeof(r_buffer))>0)
				printf("%s\n",r_buffer);
			exit(0);
		}
	  }
	  return 0;
}
// waitpid 函数,等待子进程运行完毕,父进程才可以运行。
// 由于fork函数让子进程完整地拷贝了父进程的整个地址空间,所以子进程都有管道的读端和写端。
// 所以在相关进程中最好关掉不用的那一端。
// 根据要求,“父进程先接收子进程P1发来的消息,然后再接收子进程P2发来的消息。”
// 存在两个同步问题,两个子进程和父进程之间(先子写后父读)、子进程1和子进程2之间(先1写,再2写)

存在问题:在输出过程中,若将read函数的第三个参数改为50(当write函数的第三个参数也改为50时)可以正常运行,若改为len1则会因为在子进程结束时,len1所占空间被释放而没有值。

若为sizeof(r_buffer)则可正常运行,为什么?若不使用sizeof函数,怎样使接收方正确识别应读长度?在使用sizeof函数时,经测试,sizeof(r_buffer)的值为200,那么为什么第三个参数为50可以正常运行?

已解决:w_buffer和r_buffer均为长度为200的字符数组,故在接收时,使用sizeof函数可以正确识别接受内容,这也是为什么直接将第三个参数设为35会出现乱码的原因。

  • 7
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值