Linux进程间通信之有名管道

无名管道的缺点是无法在非亲属之间进行通信,由于无名管道的缺点,对其进行改进后形成了有名管道。

所谓有名,即在文件系统中存在一个这样的文件节点,每一个文件节点都有一个inode号,而且这是一个特殊的文件类型:p管道类型。
管道文件只有inode号,不占有磁盘空间。

如何创建管道文件?
运用mkfifo函数创建管道文件。

函数名mkfifo
头文件#include<sys/types.h> , #include<sys/stat.h>
函数形式int mkfifo (const char* filename ,mode_t mode)
参数管道文件创建的文件名(需要包含路径)和权限,创建的文件权限和umask有关
返回值成功返回:0 失败返回:-1
注意mkfifo函数只创建了管道文件,并没有在内核创建管道,只有通过open函数打开文件时,管道才会创建

程序实例:
在当前目录先创建管道文件:

int main(){
    int fiforet;
    fiforet = mkfifo("./myfifo",0777);     //在当前目录下创建管道文件  权限与umask有关
    if(fiforet < 0){
        printf("Creat fifo failure\n");
    }
    printf("Creat fifo success\n");
    printf("fiforet=%d\n",fiforet);

    return 0;
}

在这里插入图片描述

不同的(非亲缘关系)进程间通信:

int main(){      //发送端
    int fiforet;
    int fd,i;
    char inter = 0;
    fiforet = mkfifo("./fifo",0777);      //创建管道文件
    if(fiforet < 0){
        printf("Creat fifo failure\n");
    }
    printf("Creat fifo success\n");
    printf("fiforet=%d\n",fiforet);
    
    fd = open("./fifo",O_WRONLY);		//打开管道文件
    if(fd < 0){
        printf("open fifo failure\n");
    }
    printf("open fifo success\n");
    
    inter = 1;
    write(fd,&inter,1);								//写入
    sleep(3);
    for(i = 0;i <5;i++){
        printf("Have send message\n");
    }
    
    return 0;
}
int main(){			//接收端
    int fiforet;
    int fd;
    char inter;
   
    fd = open("./fifo",O_RDONLY);
    if(fd < 0){
        printf("open fifo failure\n");
    }
    printf("open fifo success\n");
    
    
    read(fd,&inter,1);
    printf("inter = %d",inter); 
    if(inter == 1){
        printf("Have received message\n"); 
    }
    
    return 0;
    }

程序运行结果:
发送端:
在这里插入图片描述
接收端:
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值