华清远见作业第二十三天——IO(第六天)

发布时间:2024年01月08日

使用有名管道完成两个进程之间相互通信

?代码:

创建管道:

#include<a.h>
int main(int argc, const char *argv[])
{
    //创建有名管道文件
    if(mkfifo("./myfifo1", 0664) != 0)
    {
        perror("mkfifo1 error");
        return -1;
    }
    printf("myfifo1 create success\n");
    //创建有名管道文件
    if(mkfifo("./myfifo2", 0664) != 0)
    {
        perror("mkfifo2 error");
        return -1;
    }
    printf("myfifo2 create success\n");
    system("ls -l");
    //使用getchar阻塞一下
    getchar();
    system("rm myfifo1");
    system("rm myfifo2");
    return 0;
}

?主进程A:

#include<a.h>

int main(int argc, const char *argv[])
{
    pid_t pid = -1;   //定义变量存储进程号
    pid = fork();    //创建一个子进程
    //后续的程序,父子进程都会执行
    if(pid > 0)
    {
        printf("这是父进程对应管道1,pid = %d\n", pid);
		//以只写的形式打开管道文件
	    int wfd = -1;
	    if((wfd = open("./myfifo1", O_WRONLY)) == -1)
	    {
		perror("open error");
		return -1;
	    }
	    //向管道文件中循环写入数据
    	char wbuf[128] = "";
		while(1)
    	{
        	bzero(wbuf, sizeof(wbuf));           //清空内容
			//从终端输入数据
			printf("管道1请输入>>>>>");
        	fflush(stdout);            //刷新行缓冲区
       		read(0, wbuf, sizeof(wbuf));
        	wbuf[strlen(wbuf)-1] = 0;           //将回车换成'\0'

        	//将数据写入管道中
        	write(wfd, wbuf, sizeof(wbuf));

        	//判断
        	if(strcmp(wbuf, "quit") == 0)
        	{
            	break;
        	}
    	}

    	//关闭文件
    	close(wfd);	
    	}
    	else if(pid == 0)
    	{
        	printf("这是子进程对应管道2,pid = %d\n", pid);
    		//以只读的形式打开管道文件
    		int rfd = -1;
    		if((rfd = open("./myfifo2", O_RDONLY)) == -1)
    		{
        		perror("open error");
        		return -1;
    		}

    			printf("管道2读端打开成功\n");

    			//从管道文件中循环读取数据
    			char rbuf[128] = "";
    			while(1)
    			{
        			bzero(rbuf, sizeof(rbuf));           //清空内容

        			//从管道中读取数据
        			read(rfd, rbuf, sizeof(rbuf));

        			printf("收到消息:%s\n", rbuf);

        
        		//判断
        		if(strcmp(rbuf, "quit") == 0)
        		{
            		break;
        		}
    		}

   	 			//关闭文件
    			close(rfd);	
	
    }else 
    {
        perror("fork error");
        return -1;
    }

    while(1);


    return 0;
}

主进程B:

#include<a.h>

int main(int argc, const char *argv[])
{
	pid_t pid = -1;   //定义变量存储进程号
	pid = fork();    //创建一个子进程
	//后续的程序,父子进程都会执行
	if(pid > 0)
	{
		printf("这是父进程,pid = %d\n", pid);
		//以只读的形式打开管道文件
	    int rfd = -1;
	    if((rfd = open("./myfifo1", O_RDONLY)) == -1)
		{
			perror("open error");
			return -1;
		}
	    printf("读端打开成功\n");
	    //从管道文件中循环读取数据
		 char rbuf[128] = "";
		while(1)
	    {
			bzero(rbuf, sizeof(rbuf));           //清空内容
			//从管道中读取数据
			read(rfd, rbuf, sizeof(rbuf));
			printf("收到消息:%s\n", rbuf);
			//判断
			if(strcmp(rbuf, "quit") == 0)
			{
			    break;
			}
	     }

		    //关闭文件
		    close(rfd);
	    }else if(pid == 0)
	    {
			printf("这是子进程,pid = %d\n", pid);
    		//以只写的形式打开管道文件
    		int wfd = -1;
    		if((wfd = open("./myfifo2", O_WRONLY)) == -1)
    		{
       			 perror("open error");
        	     return -1;
   			 }

   				 printf("写端打开成功\n");

   			 //向管道文件中循环写入数据
    		char wbuf[128] = "";
    		while(1)
    		{
       			 bzero(wbuf, sizeof(wbuf));           //清空内容

        		//从终端输入数据
        		printf("请输入>>>>>");
        		fflush(stdout);            //刷新行缓冲区
        		read(0, wbuf, sizeof(wbuf));
        		wbuf[strlen(wbuf)-1] = 0;           //将回车换成'\0'

        		//将数据写入管道中
        		write(wfd, wbuf, sizeof(wbuf));

        		//判断
        		if(strcmp(wbuf, "quit") == 0)
        		{
            		break;
        		}
    		}

   			 //关闭文件
    		close(wfd);
	    }else 
	    {
			perror("fork error");
			return -1;
	    }

	    	printf("hello world\n");
	    	while(1);


    return 0;
}

运行效果:

?

?

文章来源:https://blog.csdn.net/m0_62462327/article/details/135467922
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。