我正在编写一个简单的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
(应用 ~umask
后01210
)。
您应该传递 0666
或十进制438
。
因为您正在创建只读的 fifo 吗?我在您的代码片段中看不到 mkfifo 调用的参数是什么。但"男人3 mkfifo"说的是:
它由进程的掩码以通常的方式修改: 创建文件的权限为 (mode & ~umask)。
因此,请确保模式正确,因为掩码只是这里的一个限制因素。