在 Ubuntu 20.04 中,我遇到了不同用户访问共享内存段的问题。关联文件是使用和标志的组合创建的,并shm_open()
放置在中。我有以下示例程序:O_CREAT
O_RDWR
/dev/shm
#include <stdio.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <errno.h>
int main()
{
int ret = 0;
errno = 0;
ret = shm_open("/testshm", O_CREAT | O_RDWR, 00666);
fprintf(stderr, "return value %d\n", ret);
fprintf(stderr, "result %d: %s\n", errno, strerror(errno));
return 0;
}
当我第一次运行它时,它按预期工作并被/dev/shm/testshm
创建:
$ ls -la /dev/shm
total 0
drwxrwxrwt 2 root root 60 Aug 3 16:34 .
drwxr-xr-x 18 root root 4580 Aug 3 12:41 ..
-rw-rw-r-- 1 krejci krejci 0 Aug 3 14:37 testshm
然后以同一用户身份再次运行程序,一切正常,但是当我尝试以 root 身份运行该程序时,出现“权限被拒绝”的情况:
# id
uid=0(root) gid=0(root) groups=0(root)
# ./test
return value -1
result 13: Permission denied
- 相同的代码在其他 Linux 发行版以及 Ubuntu 19.10 中运行良好。
O_CREAT
当后续程序调用中不存在该标志时,它也能正常工作。- 我在日志中没有发现任何有用的信息。
- 禁用 AppArmor 没有帮助
答案1
这是由于 Linux 内核 4.19 版为了增加安全性而做出的改变所致。
您可以通过运行以下命令将内核的行为改回原来的方式:
sudo sysctl fs.protected_regular=0
答案2
发布的代码缺少shm_unlink()
共享内存使用完成后要调用的语句
答案3
根据您的指示,我执行了:
./untitled1; ls -la /dev/shm; sudo su; ./untitled1
结果是:
return value 3
result 0: Success
total 0
drwxrwxrwt 2 root root 60 Aug 7 13:19 .
drwxr-xr-x 20 root root 4640 Aug 6 13:26 ..
-rw-r--r-- 1 richard richard 0 Aug 6 18:17 testshm
[sudo] password for richard:
root@richard-desktop:/home/richard/Documents/forum# ./untitled1
return value 3
result 0: Success
注意:我已经升级到 20,如下所示:
uname -a
Linux richard-desktop 4.15.0-112-generic #113-Ubuntu SMP Thu Jul 9 23:41:39 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux