我有一个程序可以创建四个共享内存对象。内存创建例程在尝试创建它们之前调用,并且程序调用另一个例程在运行结束时shm_unlink()
删除它们。shm_unlink()
今天,当我尝试重新创建对象 2-4(但不是对象 1)时,我得到了“权限被拒绝”的信息。 Linuxfuser
显示它们都属于同一个进程,所以我无法杀死它。
我去了/dev/shm
并做了ls -l
,发现 2-4 是 root 用户拥有的,而不是我的 sudo 用户拥有的。我很少以 root 身份登录,所以我不知道它们是如何被 root 拥有的。为了解决这个问题,我以root身份登录并手动删除它们。
我的问题是:是否有一种编程方式可以删除不同用户(例如 root)拥有的共享内存对象,而无需以该用户身份登录?有没有办法调用chown
shm 对象并更改所有者?
答案1
Root 可以删除任何用户拥有的共享内存(或其他 IPC 项)。如果您需要一种实用的方法来执行此操作,请以 root 身份执行此操作。
否则,您可能需要在创建项目时或创建之后更改其权限。所有文件系统条目(包括非文件的内容)都使用 POSIX 权限,因此您需要确保该项目可由删除它的用户写入(并且其上方的目录可由同一删除用户写入)。
确保这一点的不太理想的方法是使项目(及其父目录)全局可写。当然,这会带来巨大的安全漏洞,通常不推荐这样做。
如果运行的进程以 root 身份启动,或者从普通用户切换到 root 并返回,则创建的 IPC 项可能由 root 用户拥有。如果执行此操作的进程可以修改,那么您也许能够获得创建具有适当组权限的项目的进程,以允许除启动用户之外的用户进行删除。