I/O作业7

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

代码:

create.c:

#include<myhead.h>
 
int main(int argc, const char *argv[])
{
	//创建一个有名管道文件
	if(mkfifo("./linux", 0664)==-1)
	{
		perror("mkfifo error");
		return -1;
	}
 
	getchar();
 
	system("rm linux");  //删除管道文件
	
	return 0;

}

send.c:

#include<myhead.h>
 
int main(int argc, const char *argv[])
{
	//以写的形式打开管道文件
	int wfd = open("./linux", O_WRONLY);
	if(wfd == -1)
	{
		perror("open error");
		return -1;
	}
	printf("管道文件已经打开\n");
 
	//发送数据
	char wbuf[128] = "";
	while(1)
	{
		printf("请输入>>>>");
		fgets(wbuf, sizeof(wbuf), stdin);
		wbuf[strlen(wbuf)-1] = 0;
 
		//将数据发送给到管道中
		write(wfd, wbuf, strlen(wbuf));
 
		//判断数据
		if(strcmp(wbuf, "quit") == 0)
		{
			break;
		}
	}
 
	//关闭文件描述符
	close(wfd);
 
	
	return 0;
}

receive.c:

#include<myhead.h>
 
int main(int argc, const char *argv[])
{
	//以读的形式打开文件
	int rfd = open("./linux", O_RDONLY);
	if(rfd == -1)
	{
		perror("open error");
		return -1;		
	}
	printf("管道文件读端打开\n");
 
	//以写的形式打开文件
	int fd = open("./save.txt", O_WRONLY);
    if(fd == -1)
    {
        perror("open error");
        return -1;        
    }

	//定义接受容器
	char rbuf[128] = "";
	while(1)
	{
		bzero(rbuf, sizeof(rbuf));

		//读取数据
		read(rfd, rbuf, sizeof(rbuf));
		if(strcmp(rbuf, "quit") == 0)
		{
			break;
		}
		printf("收到消息为:%s\n", rbuf);

		//将数据发送给到文件中
		write(fd, rbuf, strlen(rbuf));
	}
 
	//关闭文件描述符
	close(rfd);
	close(fd);
	
	return 0;
}

运行结果:

 

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

 代码:

create.c:

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

 	//创建一个有名管道文件
	if(mkfifo("./pptwo", 0664)==-1)
	{
		perror("mkfifo error");
		return -1;
	}
	getchar();
 
	system("rm ppone");
	system("rm pptwo");

	return 0;

}

chat1.c:

#include<myhead.h>
 
int main(int argc, const char *argv[])
{
    //以读的形式打开文件
	int rfd1 = open("./ppone", O_RDONLY);
    
    //以写的形式打开管道文件
	int wfd1 = open("./pptwo", O_WRONLY);
	
    if(rfd1 == -1)
	{
		perror("open error");
		return -1;		
	}
	printf("管道文件1已经打开\n");
	

	if(wfd1 == -1)
	{
		perror("open error");
		return -1;
	}
	printf("管道文件2已经打开\n");
 
    //定义容器
	char wbuf1[128] = "";
    char rbuf1[128] = "";

    //创建子进程
    pid_t pid = fork();

    //判断父子进程
    if(pid > 0)
    {
        //父进程关闭读文件描述符
        close(rfd1);

        while (1)
        {
            printf("请输入:");
            fgets(wbuf1, sizeof(wbuf1), stdin);
            wbuf1[strlen(wbuf1) - 1] = 0;

            // 将数据发送给到管道中
            write(wfd1, wbuf1, strlen(wbuf1));

            // 判断数据
            if (strcmp(wbuf1, "quit") == 0)
            {
                break;
            }
        }
        //父进程关闭写文件描述符
        close(wfd1);

    }else if(pid==0)
    {
        //子文件关闭写文件描述符
        close(wfd1);

        // 子进程从管道中读取数据
        while(1)
        {
            memset(rbuf1, 0, sizeof(rbuf1));
            read(rfd1, rbuf1, sizeof(rbuf1));

            // 接收到quit,结束子进程
            if(strcmp(rbuf1, "quit") == 0)
            {
                break;
            }

            // 接收到的数据
            printf("\n接收到的数据:%s\n", rbuf1);
        }

        //子进程关闭读文件描述符
        close(rfd1);

    }else
    {
        perror("fork error"); 
        
        // 关闭文件描述符
        close(wfd1);
        close(rfd1);
        return -1;
    }

    return 0;
}

chat2.c:

#include<myhead.h>
 
int main(int argc, const char *argv[])
{
    
    //以写的形式打开管道文件
	int wfd2 = open("./ppone", O_WRONLY);
    
    //以读的形式打开文件
	int rfd2 = open("./pptwo", O_RDONLY);
    
	if(rfd2 == -1)
	{
		perror("open error");
		return -1;		
	}
	printf("管道文件2已经打开\n");
	

	if(wfd2 == -1)
	{
		perror("open error");
	    return -1;
	}
	printf("管道文件1已经打开\n");
 
    //定义容器
	char wbuf2[128] = "";
    char rbuf2[128] = "";

    //创建子进程
    pid_t pid = fork();

    //判断父子进程
    if(pid > 0)
    {
        //子文件关闭写文件描述符
        close(wfd2);

        // 子进程从管道中读取数据
        while(1)
        {
            memset(rbuf2, 0, sizeof(rbuf2));
            read(rfd2, rbuf2, sizeof(rbuf2));
            
            // 接收到quit,结束子进程
            if(strcmp(rbuf2, "quit") == 0)
            {
                break;
            }
            
            // 接收到的数据
            printf("\n接收到的数据:%s\n", rbuf2);
        }

        //子进程关闭读文件描述符
        close(rfd2);

        
    }else if(pid==0)
    {
        //父进程关闭读文件描述符
        close(rfd2);

        while (1)
        {
            printf("请输入:");
            fgets(wbuf2, sizeof(wbuf2), stdin);
            wbuf2[strlen(wbuf2) - 1] = 0;

            // 将数据发送给到管道中
            write(wfd2, wbuf2, strlen(wbuf2));

            // 判断数据
            if (strcmp(wbuf2, "quit") == 0)
            {
                break;
            }
        }
        //父进程关闭写文件描述符
        close(wfd2);

        
    }else
    {
        perror("fork error"); 
        
        // 关闭文件描述符
        close(wfd2);
        close(rfd2);
        return -1;
    }

    return 0;
}

运行结果:

 

思维导图:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值