10月18日作业

使用有名管道实现两个进程之间相互通信。

有名管道的创建1

#include <head.h>
int main(int argc, const char *argv[])
{//创建有名管道
	if(mkfifo("./myfifo",0664)!=0)
	{
	  perror("mkfifo error");
	  return -1;
	}
	getchar();//阻塞程序
	system("rm myfifo");
	return 0;
}

有名管道的创建2

#include <head.h>
int main(int argc, const char *argv[])
{//创建有名管道
	if(mkfifo("./myfifo2",0664)!=0)
	{
	  perror("mkfifo2 error");
	  return -1;
	}
	getchar();//阻塞程序
	system("rm myfifo2");
	return 0;
}

进程一

#include<head.h>
int main(int argc, const char *argv[])
{
   //创建一个子进程
   pid_t cpid=fork();
   if(cpid>0)//父进程
   {

     //打开管道文件
	 int rfd;
	 if((rfd=open("./myfifo",O_RDONLY))==-1)
	 {
	   perror("open  error");
	   return -1;

	 }
	 //向循环文件中写入数据
	 char buf[128]="";
	 while(1)
	 {
	    bzero(buf,sizeof(buf));

		
		read(rfd,buf,sizeof(buf));
	
		//如果输入的是quit,则退出程序
		if(strcmp(buf,"quit")==0)
		{
		  printf("写进程序已经退出,读进程也要退出了\n");
		  break;
		}
   printf("读取的数据:%s\n",buf);
	 }
	 //关闭文件
	 close(rfd);
   }
   else if(cpid==0)//子进程
   {
      //打开管道文件
        int wfd;
        if((wfd=open("./myfifo2",O_WRONLY))==-1)
       {
          perror("open  error");
          return -1;
 
       }
       //向循环文件中写入数据
       char buf[128]="";
       while(1)
       {
          bzero(buf,sizeof(buf));
  
          printf("请输入>>");
         fgets(buf,sizeof(buf),stdin);
          buf[strlen(buf)-1]=0;
  
          write(wfd,buf,sizeof(buf));
          //如果输入的是quit,则退出程序
          if(strcmp(buf,"quit")==0)                            
          {
            printf("写进程序退出\n");
            break;
          }
  
       }
       //关闭文件
   close(wfd);

   }
   else if(cpid<0)
   {
   perror("fork");
   return -1;
   }
	return 0;
}

进程二

#include<head.h>
int main(int argc, const char *argv[])
{

	//创建一个子进程
	pid_t cpid=fork();

	if(cpid>0)
     //打开管道文件
	{int wfd;
	 if((wfd=open("./myfifo",O_WRONLY))==-1)
	 {
	   perror("open  error");
	   return -1;

	 }
	 //向循环文件中写入数据
	 char buf[128]="";
	 while(1)
	 {
	    bzero(buf,sizeof(buf));

		printf("请输入>>");
		fgets(buf,sizeof(buf),stdin);
		buf[strlen(buf)-1]=0;

		write(wfd,buf,sizeof(buf));
		//如果输入的是quit,则退出程序
		if(strcmp(buf,"quit")==0)
		{
		  printf("写进程序退出\n");
		  break;
		}

	 }
	 //关闭文件
	 close(wfd);
	}
	else if(cpid==0)//子进程
	{
	 //打开管道文件
	   int rfd;
	   if((rfd=open("./myfifo2",O_RDONLY))==-1)
			   {
			      perror("open error");
				  return -1;
			   }
	   //向循环文件中写入数据
	   char buf[128]="";
       while(1)
       {
         bzero(buf,sizeof(buf));
 
 
         read(rfd,buf,sizeof(buf));
 
          //如果输入的是quit,则退出程序
          if(strcmp(buf,"quit")==0)
          {
            printf("写进程序已经退出,读进程也要退出了\n");
            break;
          }
     printf("读取的数据:%s\n",buf);
       }
      //关闭文件
     close(rfd);

	}
	else if(cpid<0)
	{
	  perror("fork");
	  return -1;
	
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值