进程间通信(IPC

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

create.c

#include<myhead.h>

//创建通道
int main()
{
    if(mkfifo("./lz",0664)==-1)
    {
        perror("mkfifo error");
        return -1;
    }
    printf("通道已开启,摁回车关闭\n");
    getchar();
    system("rm lz");
    return 0;
}

send.c

#include<myhead.h>

int main()
{
    int wfd=open("./lz",O_WRONLY);
    if(wfd==-1)
    {
        perror("open error");
        return -1;
    }
    char buf[128]="";
    while(1)
    {
        printf("请输入>>>");
        //从终端读取数据
        fgets(buf,sizeof(buf),stdin);
        //最后一位换成'\0'
        buf[strlen(buf)-1]=0;
        //写入通道
        write(wfd,buf,strlen(buf));
        //判断结束
        if(strcmp(buf,"quit")==0)
        {
            break;
        }
        
    }
    //关闭通道写入
    close(wfd);
    return 0;
}

recv.c

#include<myhead.h>

int main()
{
    int wfd=open("./lz",O_RDONLY);
    if(wfd==-1)
    {
        perror("open error");
        return -1;
    }
    int pt=-1;
    if((pt=open("./text.txt",O_WRONLY|O_CREAT|O_TRUNC,0664))==-1)
    {
        perror("open error");
        return -1;
    }
    char buf[128]="";
    while(1)
    {
        //清空
        bzero(buf, sizeof(buf));
        //从通道读取数据
        read(wfd, buf, sizeof(buf));
        //判断离开
        if(strcmp(buf,"quit")==0)
        {
            break;
        }
        printf("收到%s\n",buf);
        //写入文件
        write(pt,buf,strlen(buf));
    }
    //关闭文件指针
    close(pt);
    //关闭通道读写
    close(wfd);
    return 0;
}

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

create.c 

#include<myhead.h>

//创建通道
int main()
{
    if(mkfifo("./lz1",0664)==-1)
    {
        perror("mkfifo error");
        return -1;
    }
    if(mkfifo("./lz2",0664)==-1)
    {
        perror("mkfifo error");
        return -1;
    }
    printf("通道已开启,摁回车关闭\n");
    getchar();
    system("rm lz1 lz2");
    return 0;
}

 usr1.c

#include<myhead.h>

int main()
{
    
    char buf[128]="";
    pid_t pid=fork();
    if(pid<0)
    {
        perror("pid error");
        return -1;
    }else if(pid>0)
    {
        //父进程打开通道1写入
        int wfd1=open("./lz1",O_WRONLY);
        if(wfd1==-1)
        {
            perror("open error");
            return -1;
        }
        while(1)
        {
            printf("请输入>>>");
            //从终端读取数据
            fgets(buf,sizeof(buf),stdin);
            //最后一位换成'\0'
            buf[strlen(buf)-1]=0;
            //写入通道
            write(wfd1,buf,strlen(buf));
            //判断结束
            if(strcmp(buf,"quit")==0)
            {
                break;
            }
        }
        //关闭通道写入
        close(wfd1);
    }else{
        //子进程打开通道2读取
        int wfd2=open("./lz2",O_RDONLY);
        if(wfd2==-1)
        {
            perror("open2 error");
            return -1;
        }
        while(1)
        {
            //清空
            bzero(buf, sizeof(buf));
            //从通道读取数据
            read(wfd2, buf, sizeof(buf));
            //判断离开
            if(strcmp(buf,"quit")==0)
            {
                break;
            }
            printf("收到%s\n",buf);
        }
        //关闭通道写入
        close(wfd2);
    }
   
    
    
    
    return 0;
}

usr2.c

#include<myhead.h>

int main()
{
    //定义搬运工
    char buf[128]="";
    //创建进程
    pid_t pid=fork();
    if(pid<0)
    {
        perror("pid error");
        return -1;
    }else if(pid==0)
    {
        //子进程打开通道2写入
        int wfd2=open("./lz2",O_WRONLY);
        if(wfd2==-1)
        {
            perror("open error");
            return -1;
        }
        while(1)
        {
            printf("请输入>>>");
            //从终端读取数据
            fgets(buf,sizeof(buf),stdin);
            //最后一位换成'\0'
            buf[strlen(buf)-1]=0;
            //写入通道
            write(wfd2,buf,strlen(buf));
            //判断结束
            if(strcmp(buf,"quit")==0)
            {
                break;
            }
        }
         //关闭通道写入
        close(wfd2);
    }else{
        //父进程打开通道1读取
        int wfd1=open("./lz1",O_RDONLY);
        if(wfd1==-1)
        {
            perror("open error");
            return -1;
        }
        while(1)
        {
            //清空
            bzero(buf, sizeof(buf));
            //从通道读取数据
            read(wfd1, buf, sizeof(buf));
            //判断离开
            if(strcmp(buf,"quit")==0)
            {
                break;
            }
            printf("收到%s\n",buf);
        }
        //关闭通道读取
        close(wfd1);
    }
    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值