C - 命名管道权限位



我正在编写一个简单的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;
...

提前感谢您的帮助。

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

您应该传递 0666 或十进制438

这不是

因为您正在创建只读的 fifo 吗?我在您的代码片段中看不到 mkfifo 调用的参数是什么。但"男人3 mkfifo"说的是:

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

因此,请确保模式正确,因为掩码只是这里的一个限制因素。

最新更新