有名管道实现通信

1>使用有名管道实现,一个进程用于给另一个进程发消息,另一个进程收到消息后,展示到终端上,并且将消息保存到文件上

mkfifo.c

     1	#include<myhead.h>
     2	int main(int argc, const char *argv[])
     3	{
     4		//创建一个有名管道文件
     5		if(mkfifo("./linux",0664)==-1)
     6		{
     7			perror("mkfifo error");
     8			return -1;
     9		}
    10		getchar();
    11		system("rm linux");
    12		return 0;
    13	}

process1.c

     1	#include<myhead.h>
     2	int main(int argc, const char *argv[])
     3	{
     4		//以读的形式打开文件
     5		int rfd=open("./linux",O_RDONLY);
     6		if(rfd==-1)
     7		{
     8			perror("open error");
     9			return -1;
    10		}
    11		printf("管道文件读端打开\n");
    12	
    13		//以写打开文件,保存传入的信息
    14		int fd=open("./lx.txt",O_WRONLY|O_CREAT|O_TRUNC,0664);
    15		if(fd==-1)
    16		{
    17			perror("open error");
    18			return -1;
    19		}
    20	
    21		//定义接受容器
    22		char rbuf[128]="";
    23		while(1)
    24		{
    25			bzero(rbuf,sizeof(rbuf));
    26			//读取数据
    27			read(rfd,rbuf,sizeof(rbuf));
    28			if(strcmp(rbuf,"quit")==0)
    29			{
    30				break;
    31			}
    32	
    33			//在终端输出收到的消息
    34			printf("收到消息为:%s\n",rbuf);
    35	
    36			//将收到的消息写入到文件中
    37			write(fd,rbuf,sizeof(rbuf));
    38	
    39			char a='\n';
    40			write(fd,&a,1);
    41	
    42		}
    43	
    44		//关闭文件描述符号
    45		close(rfd);
    46		close(fd);
    47		return 0;
    48	}

process2.c

     1	#include<myhead.h>
     2	int main(int argc, const char *argv[])
     3	{
     4		//以写的形式打开文件
     5		int wfd=open("./linux",O_WRONLY);
     6		if(wfd==-1)
     7		{
     8			perror("open error");
     9			return -1;
    10	
    11		}
    12		printf("管道文件已经打开\n");
    13	
    14		//发送数据
    15		char wbuf[128]="";
    16		while(1)
    17		{
    18			printf("请输入>>>");
    19			fgets(wbuf,sizeof(wbuf),stdin);
    20			wbuf[strlen(wbuf)-1]=0;
    21	
    22	
    23			//将数据发送到管道中
    24			write(wfd,wbuf,strlen(wbuf));
    25	
    26			//判读数据
    27			if(strcmp(wbuf,"quit")==0)
    28			{
    29				break;
    30			}
    31		}
    32		//关闭文件描述符
    33		close(wfd);
    34		return 0;
    35	}

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

process_one.c

     1	#include<myhead.h>
     2	int main(int argc, const char *argv[])
     3	{
     4		//定义变量存储进程的pid号
     5		pid_t pid = -1;
     6	
     7		//创建一个子进程
     8		pid=fork();
     9	
    10		//对pid进行判断
    11		if(pid<0)
    12		{
    13			perror("fork error");
    14			return -1;
    15		}
    16		else if(pid==0)        //子进程
    17		{
    18			
    19	
    20				//以读的形式打开管道文件2
    21				int rfd=open("./linux2",O_RDONLY);
    22				if(rfd==-1)
    23				{
    24					perror("open error");
    25					return -1;
    26				}
    27				printf("管道文件2读端已经打开\n");
    28	
    29				//搬运工
    30				char rbuf[128]="";
    31				while(1)
    32				{
    33					//清空容器
    34					bzero(rbuf,sizeof(rbuf));
    35	
    36					//读取数据
    37					read(rfd,rbuf,sizeof(rbuf));
    38					if(strcmp(rbuf,"quit")==0)
    39					{
    40						break;	
    41					}
    42					printf("进程A收到的消息:%s\n",rbuf);
    43				}
    44	
    45	
    46			close(rfd);
    47			exit(EXIT_SUCCESS);
    48	
    49		}
    50	
    51		//以写的形式打开管道文件1
    52		int wfd = open("./linux1",O_WRONLY);
    53		if(wfd==-1)
    54		{
    55			perror("open error");
    56			return -1;
    57		}
    58	
    59		printf("管道文件1写端已经打开\n");
    60	
    61		//搬运工
    62		char wbuf[128]="";
    63		while(1)
    64		{
    65			printf("进程A发送的消息:");
    66			fgets(wbuf,sizeof(wbuf),stdin);
    67			wbuf[strlen(wbuf)-1]=0;
    68	
    69			//将数据发送到管道中
    70			write(wfd,wbuf,strlen(wbuf));
    71	
    72			//退出判断
    73			if(strcmp(wbuf,"quit")==0)
    74			{
    75				break;
    76			}
    77		}
    78		//关闭文件描述符  
    79		close(wfd);
    80	
    81	
    82		return 0;
    83	}
    84	

process_two.c

    1	#include<myhead.h>
     2	int main(int argc, const char *argv[])
     3	{
     4		//定义变量存储进程的pid号
     5		pid_t pid = -1;
     6	
     7		//创建一个子进程
     8		pid=fork();
     9	
    10		//对pid进行判断
    11		if(pid<0)
    12		{
    13			perror("fork error");
    14			return -1;
    15		}
    16		else if(pid==0)   //子进程
    17		{
    18			
    19			
    20				//以写的形式打开管道文件2
    21				int wfd = open("./linux2",O_WRONLY);
    22				if(wfd==-1)
    23				{
    24					perror("open error");
    25					return -1;
    26				}
    27	
    28				printf("管道文件2写端已经打开\n");
    29	
    30				//搬运工
    31				char wbuf[128]="";
    32				while(1)
    33				{
    34					printf("进程B发送的消息:");
    35					fgets(wbuf,sizeof(wbuf),stdin);
    36					wbuf[strlen(wbuf)-1]=0;
    37	
    38					//将数据发送到管道中
    39					write(wfd,wbuf,strlen(wbuf));
    40	
    41					//退出判断
    42					if(strcmp(wbuf,"quit")==0)
    43					{
    44						break;
    45					}
    46				}
    47				//关闭文件描述符  
    48				close(wfd);
    49				exit(EXIT_SUCCESS);
    50	
    51	
    52		}
    53	
    54		//以读的形式打开管道文件1
    55		int rfd=open("./linux1",O_RDONLY);
    56		if(rfd==-1)
    57		{
    58			perror("open error");
    59			return -1;
    60		}
    61		printf("管道文件1读端已经打开\n");
    62	
    63		//搬运工
    64		char rbuf[128]="";
    65		while(1)
    66		{
    67			//清空容器
    68			bzero(rbuf,sizeof(rbuf));
    69	
    70			//读取数据
    71			read(rfd,rbuf,sizeof(rbuf));
    72			if(strcmp(rbuf,"quit")==0)
    73			{
    74				break;	
    75			}
    76			printf("进程B收到的消息:%s\n",rbuf);
    77		}
    78	
    79	
    80		//关闭文件描述符
    81		close(rfd);
    82	
    83	
    84		return 0;
    85	}
    86	

需要创建管道两个管道

#include<myhead.h>

int main(int argc, const char *argv[])
{
    //创建有名管道文件
    if(mkfifo("./linux1", 0664)==-1)
    {
        perror("mkfifo error");
        return -1;
    }

    getchar();
    system("rm linux1");

    return 0;
}

思维导图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值