进程间通信——day8.5

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

create.c

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

snd.c

#include<myhead.h>
int main(int argc, char const *argv[])
{
    //以只写的形式打开管道文件
    int wfd=open("./lalala",O_WRONLY);
    if(wfd==-1)
    {
        perror("open error");
        return -1;
    }

    //以追加的形式打开记录文件
    int fd=open("./file.txt",O_WRONLY | O_CREAT | O_TRUNC,0664);
    if(fd==-1)
    {
        perror("open file error");
        return -1;
    }

    //发送数据
    char wbuf[128]="";
    while(1)
    {
        printf("请输入>>>");
        fgets(wbuf,sizeof(wbuf),stdin);
        wbuf[strlen(wbuf)-1]=0;         //fgets录入时,会将结尾的回车也录进去,将其变成结束符\0

        //将数据写到记录文件中
        write(fd,wbuf,strlen(wbuf));
        //将数据传输到管道文件中
        write(wfd,wbuf,strlen(wbuf));

        //判断结束语句
        if(strcmp(wbuf,"quit")==0)
        {
            break;
        }
    }
    //关闭文件描述符
    close(wfd);
    close(fd);
    return 0;
}

recv.c

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

    //定义接收容器
    char rbuf[128]="";
    while(1)
    {
        bzero(rbuf,sizeof(rbuf));
        //读取数据
        read(rfd,rbuf,sizeof(rbuf));
        //判断结束语句
        if(strcmp(rbuf,"quit")==0)
        {
            break;
        }
        printf("收到消息为:%s\n",rbuf);
    }
    //关闭文件描述符
    close(rfd);
    return 0;
}

发消息端进程:

收消息端进程

记录文件file.txt中:

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

首先要创建两个通道文件

create1.c

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

create2.c

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

进程1 :  snd.c

#include <myhead.h>

int main(int argc, char const *argv[])
{
    //创建一个父子进程
    pid_t pid1 = fork();

    //父进程
    if (pid1 > 0)
    {
        //以写的形式打开文件
        int wfd1 = open("./one", O_WRONLY);
        if (wfd1 == -1)
        {
            perror("open one error");
            return -1;
        }
        //发送信息
        char wbuf1[128] = "";
        printf("可以开始聊天了\n");
        while (1)
        {
            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 (pid1 == 0)
    {
        //以读的形式打开文件
        int rfd1 = open("./two", O_RDONLY);
        if (rfd1 == -1)
        {
            perror("open two error");
            return -1;
        }
        //定义接收容器
        char rbuf1[128] = "";
        while (1)
        {
            bzero(rbuf1, sizeof(rbuf1));
            //读取数据
            read(rfd1, rbuf1, sizeof(rbuf1));
            if (strcmp(rbuf1, "quit") == 0)
            {
                break;
            }
            printf("对方:%s\n", rbuf1);
        }
        close(rfd1);
        _exit(EXIT_SUCCESS);
    }

    else
    {
        perror("open error");
        return -1;
    }

    //非阻塞回收
    waitpid(-1, NULL, WNOHANG);
    return 0;
}

进程2:recv.c

#include <myhead.h>

int main(int argc, char const *argv[])
{
    //创建一个父子进程
    pid_t pid2 = fork();

    //父进程
    if (pid2 > 0)
    {
        //以读的形式打开文件
        int rfd2 = open("./one", O_RDONLY);
        if (rfd2 == -1)
        {
            perror("open one error");
            return -1;
        }
        //定义接收容器
        char rbuf2[128] = "";
        while (1)
        {
            bzero(rbuf2, sizeof(rbuf2));
            //读取数据
            read(rfd2, rbuf2, sizeof(rbuf2));
            if (strcmp(rbuf2, "quit") == 0)
            {
                break;
            }
            printf("对方:%s\n", rbuf2);
        }
        close(rfd2);
    }

    //子进程
    else if (pid2 == 0)
    {
        //以写的形式打开文件
        int wfd2 = open("./two", O_WRONLY);
        if (wfd2 == -1)
        {
            perror("open two error");
            return -1;
        }
        //发送信息
        char wbuf2[128] = "";
        printf("可以开始聊天了\n");
        while (1)
        {
            fgets(wbuf2, sizeof(wbuf2), stdin);
            wbuf2[strlen(wbuf2) - 1] = 0;

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

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

    else
    {
        perror("open error");
        return -1;
    }

    //非阻塞回收
    waitpid(-1, NULL, WNOHANG);
    return 0;
}

运行结果:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值