1

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

预先感谢您的帮助。

4

2 回答 2

3

您传递的值是 decimal 666,对应于八进制0123201210应用后~umask)。

您应该通过0666, 或 decimal 438

于 2012-06-26T16:01:42.550 回答
0

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

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

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

于 2012-06-26T15:51:28.580 回答