【问题标题】:named pipes permission bits命名管道权限位
【发布时间】:2012-06-26 15:38:09
【问题描述】:

我正在编写一个简单的 C 程序来交换消息 通过linux上的命名管道。问题是我有 以超级用户身份运行它以使其工作,否则我得到: “权限被拒绝”错误。 授予目录的写权限:

drwxr-xr-x 2 alpa alpa  4096 26 giu 17.24 .

Umask应该没问题:

$ umask
0022

实际上创建了管道文件,但具有错误权限位:

$ ls -l | grep fifo.fifo
pr----x--t 1 alpa alpa     0 26 giu 17.29 fifo.fifo

所以当我尝试打开它以读取或写入 open() 系统调用失败。

代码如下:

...
if(mkfifo(pathname, perms) == -1 && errno != EEXIST)
  return NULL;
if(chmod(pathname, perms) == -1)
    return NULL;
...
fifo->fd[0]= open(fifo->pathname, O_RDONLY);
 if(fifo->fd[0] == -1){
fifo_delete(&fifo);
  return NULL;
...

提前感谢您的帮助。

【问题讨论】:

  • 您传递的perms 的值是多少?
  • fifo=fifo_make("./fifo.fifo", 2, 666, 'r') 值为666
  • 666 是十进制的。你想要 0666。
  • 粘性位 (t) 表示数字不是八进制是问题的最可能原因。
  • 这解决了我的问题。非常感谢

标签: c unix named-pipes


【解决方案1】:

您传递的值是十进制的666,对应八进制的01232(应用~umask后的01210)。

您应该传递 0666 或十进制 438

【讨论】:

  • @alpa 确保选择这个答案作为解决方案;)
【解决方案2】:

这不是因为您正在创建只读fifo吗?我看不到在您的 sn-p 中调用 mkfifo 的参数是什么。但是“man 3 mkfifo”说的是:

它被进程的umask以通常的方式修改: 创建文件的权限为 (mode & ~umask)。

所以请确保模式正确,因为 umask 在这里只是一个限制因素。

【讨论】:

  • 模式为666,umask 022
  • hm.... 对我有用 ;) 如果您在命令行中使用 mkfifo 创建管道会发生什么?您是否尝试过将烫发修改为 0666 而不是 666?看起来这就是问题所在,尤其是通过查看您为该 fifo 获得的奇怪权限...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-02
  • 2012-11-03
  • 1970-01-01
  • 1970-01-01
  • 2011-05-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多