进程通信--有名管道

  • 有名管道与无名管道对比,在于创建了一个FIFO文件,即使没有亲缘关系的进程,也可通过访问FIFO文件进行数据的交互。
  • FIFO是先入先出,与普通文件的操作一样,通过read()/write()/close()函数对其进行操作。
  • FIFO文件不会删除,会一直存在于文件系统中。
  • 函数原型
  • #include <sys/types.h>
    #include <sys/stat.h>
    
    //创建FIFO文件
    int mkfifo(const char * pathname, mode_t mode);
    
    //参数含义
        pathname: 管道名称路径
        mode    :文件的权限
    //返回值
        成功返回0;失败返回-1
  • 扩展知识
    #include <unistd.h>
    
    int access(const char * pathname, int mode);
    
    //作用:判断一个文件是否存在。
    
    //参数
        pathname: 需要判断是否存在的文件路径名
        mode    :需要判断的操作模式
    
    //mode的值
        R_OK      测试读许可权
        W_OK      测试写许可权
        X_OK      测试执行许可权
        F_OK      测试文件是否存在
    
    //返回值
        成功执行:返回0;失败:返回-1。errno被设为以下的某个值
        EINVAL: 模式值无效
        EACCES: 文件或路径名中包含的目录不可访问
        ELOOP : 解释路径名过程中存在太多的符号连接
        ENAMETOOLONG:路径名太长
        ENOENT: 路径名中的目录不存在或是无效的符号连接
        ENOTDIR:路径名中当作目录的组件并非目录
        EROFS:  文件系统只读
        EFAULT: 路径名指向可访问的空间外
        EIO:    输入输出错误
        ENOMEM: 不能获取足够的内核内存
        ETXTBSY:对程序写入出错
    
  • 写FIFO文件(mkfifo_write.c) 
    #include <stdio.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <unistd.h>
    
    int main(void){
        int rst = access("myFIFO", F_OK);//首先判断该文件是否存在
        if(rst == -1){
            printf("文件不存在!\n");
            
            int ret = mkfifo("test", 0777);
            if(ret == -1){
                perror("mkfifo创建失败!\n");
                exit(0);
            }
        }
        
        //以只写的方式创建管道
        int fd = open("test", O_WRONLY);
        if(fd == -1){
            perror("以只写的权限打开文件失败!\n");
            exit(0);
        }
        //向FIFO中写入数据
        for(int i = 0; i < 20; i++) {
            char buf[1024];
            sprintf(buf, "hello, %d\n", i);//将数据写入buf中
            printf("写入的数据为 : %s\n", buf);
            write(fd, buf, strlen(buf));//将数据写入到FIFO文件中
            sleep(1);//延时1s
        }
        close(fd);//使用完关闭文件
        //手动删除文件,方便下次能继续创建,否则的话文件存在,无法运行
        remove("myFIFO");
        return 0;
    }
  • 读FIFO文件(mkfifo_read.c)
  • #include <stdio.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <unistd.h>
    
    int main(void){
        //由于FIFO文件已经创建,故不必再创建
        //以只读方式打开FIFO文件
        int fd = open("myFIFO", O_RDONLY);
        if(fd == -1){
            perror("以只读方式打开FIFO文件失败!\n");
            exit(0);
        }
        //读取FIFO中的数据
        while(1){
            char buf[1024];
            int len = read(fd, buf, sizeof(buf));
            if(len == 0){
                //说明数据全部已被读出
                break;//跳出死循环
            }
            printf("读取的数据是: %s\n", buf);
        }
        close(fd);//最后关闭文件
        return 0;
    }
  • 实验结果:实现了两个无亲缘关系的进程间的通信(一个进程发数据,另一个进程接收数据)
  • 今天就记录到这里,后续遇到需要补充后的再进行添加。
  • 22
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值