linux无权限open_Linux非亲缘进程间通信:有名管道

8342d6671496190089d4564f62f74c6e.png

图控大叔

构图传递思想

阅读从未如此简单!!!

01

前言

       今天来说说Linux进程间通信:匿名管道。Linux环境下,进程间的通信方式有很多,有管道,IPC机制下的消息队列、共享内存和信号量,Posix机制下的有名信号量和无名信号量。今天要分享的内容是亲缘进程间的通信方式:匿名管道。待分享的内容还很多,慢慢来!

02

细述

7927df4de3b2a3ae539d02f94cce5ea6.gif有名管道特点
有名管道特点
  1,他能够作用无任何亲缘关系的进程
  
  2,全双工通信
  
  3,操作有原子性
  
  4,无法用lseek定位操作位置
7927df4de3b2a3ae539d02f94cce5ea6.gif相关API
需包含头文件
#include 
#include 
#include 

相关函数
创建一个有名管道文件
  int mkfifo(const char *pathname, mode_t mode);
  
检查指定文件的权限(存在与否)
  int access(const char *pathname, int mode);

打开
  int open(const char *pathname, mode_t mode);

关闭
  close(fifo_fd);

读操作
  read(fifo_fd, buffer, sizeof(buffer));
  
写操作
  write(fifo_fd, buffer, sizeof(buffer));
7927df4de3b2a3ae539d02f94cce5ea6.gif部分函数说明
部分函数说明

1、创建一个有名管道文件
  int mkfifo(const char *pathname, mode_t mode);

  参数说明
  pathname:创建的管道文件名字(可以附加路径)
        注意:一定得是linux下面的文件系统才能够创建出来,
            禁止使用windows的共享文件夹)

  mode:创建出来的文件的权限值(参照open函数的mode参数)

2、检查指定文件的权限(存在与否)
  int access(const char *pathname, int mode);

  参数说明
    pathname:指定查的文件名(可以附加路径)
    Mode:代表检查的权限
      R_OK:判断是否可读
      W_OK:判断是否可写
      X_OK:判断是否可执行
      F_OK:判断文件是否存在
    
  返回值:
  如果权限可以,则返回0,否则返回-1
7927df4de3b2a3ae539d02f94cce5ea6.gif应用场景
应用场景:
  1,因为其操作具备原子性,经常拿过来作为一个多入口缓冲区
  2,非亲缘进程间通信
7927df4de3b2a3ae539d02f94cce5ea6.gif参考代码:写入操作
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#define  FIFO_NAME "myfifo"   //文件名

int main(void){
  int retval;
  int fifo_fd;
  ssize_t wr_ret;
  char buffer[1024];

  //判断FIFO_NAME代表的文件是否存在,不存在则进入判断语句中
  if(access( FIFO_NAME, F_OK) != 0)
  {
    //创建一个有名管道文件FIFO_NAME:代表文件名,0644:代表创建文件的权限
    mkfifo(FIFO_NAME, 0644);
  }
  fifo_fd = open(FIFO_NAME, O_RDWR);
  if(fifo_fd == -1)
  {
    perror("打开管道出错\n");
    return -1;
  }
  while(1)
  {
    fgets(buffer, sizeof(buffer), stdin);

    wr_ret = write(fifo_fd, buffer, strlen(buffer));
    if(wr_ret == -1)
    {
      perror("写入管道数据异常");
      break;
    }
  }
  close(fifo_fd);
  return 0;
}
7927df4de3b2a3ae539d02f94cce5ea6.gif参考代码:读出操作
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#define  FIFO_NAME "myfifo"     //文件名

int main(void){
  int retval;
  int fifo_fd;
  ssize_t rd_ret;
  char buffer[1024];

  if(access( FIFO_NAME, F_OK) != 0)
  {
    mkfifo(FIFO_NAME, 0644);
  }

  fifo_fd = open(FIFO_NAME, O_RDWR);
  if(fifo_fd == -1)
  {
    perror("打开管道出错\n");
    return -1;
  }
  while(1)
  {
    bzero(buffer, sizeof(buffer));

    rd_ret = read(fifo_fd, buffer, sizeof(buffer));
    if(rd_ret == -1)
    {
      perror("读取管道数据异常");
      break;
    }
    printf("读到大小为%ld,内容为 %s 的数据\n", rd_ret, buffer);
  }
  close(fifo_fd);
  return 0;
}

03

结尾

       好了,本次关于Linux下非亲缘进程间的通信方式:有名管道的分享,到这里就结束了,如果读者在阅读过程中发现有什么纰漏,希望后台留言一起交流!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值