C实现进程间通讯

进程间通讯

server
#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<stdlib.h>
#include<unistd.h>

// #define ERR_EXIT(m)\      //将报错与退出包成一个宏
//     do\
//     {\
//          perror(m);\
//         exit(EXIT_FAILURE);\
//     }while(0)

int main()
{
    umask(0);
    /*
        umask函数用来修改进程的umask。参数mask可以直接取数值也可以为open系统调用第三个参数mode的11个宏或他们的组合

        S_IRWXU 00700 user (file owner) has read, write and execute permission

        S_IRUSR 00400 user has read permission

        S_IWUSR 00200 user has write permission

        S_IXUSR 00100 user has execute permission

        S_IRWXG 00070 group has read, write and execute permission

        S_IRGRP 00040 group has read permission

        S_IWGRP 00020 group has write permission

        S_IXGRP 00010 group has execute permission

        S_IRWXO 00007 others have read, write and execute permission

        S_IROTH 00004 others have read permission

        S_IWOTH 00002 others have write permission

        S_IXOTH 00001 others have execute permission

        例:umask(0);//不屏蔽任何权限
            umask(S_IRWXO);//屏蔽其他用户的所有权限
    */
    
    if(mkfifo("mypipe",0644)<0)     //创建一个命名管道
        //ERR_EXIT("mkfifo");
        printf("error");

    int rfd=open("mypipe",O_RDONLY);
    if(rfd<0)
        //ERR_EXIT("open");
        printf("error");

    char buf[1024];
    while(1)
    {
        buf[0]=0;
        printf("Please wait....\n");
        size_t s=read(rfd,buf,sizeof(buf)-1);
        if(s>0)
        {
            buf[s]=0;
            printf("client say# %s\n",buf);
        }
        else if(s==0)
        {
            printf("client quit,exit now!\n");
            exit(EXIT_SUCCESS);
        }
        else
        {
            //ERR_EXIT("read");
        }
    }
    close(rfd);
    return 0;
}

client
#include<stdio.h>
#include<sys/types.h>
#include<stdlib.h>
#include<unistd.h>
#include<fcntl.h>
#include<sys/stat.h>
#include<string.h>

// #define ERR_EXIT(m)\
//     do\
//     {\
//     perror(m);\
//         exit(EXIT_FAILURE);\
//     }while(0)

int main()
{
    int wfd=open("mypipe",O_WRONLY);
    if(wfd<0)
    {
        // ERR_EXIT("open");
    }

    char buf[1024];
    int a=100;    //message number
    while(a--)
    {
        buf[0]=0;
        printf("Please Enter# ");
        fflush(stdout);
        size_t s=read(0,buf,sizeof(buf)-1);
        if(s>0)
        {
            buf[s]=0;
            write(wfd,buf,strlen(buf));
        }
        else if(s<=0)
        {
            // ERR_EXIT("read");
        }
    }
    close(wfd);

    return 0;
}

通讯效果:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值