这XDG 基础目录规范是针对用户目录的一个非常有趣的规范。它还提供了很好的默认值,但 除外XDG_RUNTIME_DIR
。
现在我正在编写一个需要创建命名管道的软件。它是一个每个用户的客户端-服务器框架(服务器有一个 FIFO,每个客户端都有一个 FIFO)。
如果XDG_RUNTIME_DIR
没有定义,我目前正在使用每个用户的子目录/tmp
——但它不能确保所有指定的条件(即以“目录的生存期必须与登录的用户绑定……”)
够/tmp/myserver-$USER
好嗎?
编辑
我在其他地方看到了一些建议:
.
是相当不令人满意的(至少因为它不是绝对路径)。- 我还看到了
/var/run/user/$USER
——还不错,但是那个目录不存在(至少在我运行 Debian 的机器上)测试)
答案1
/tmp
已经被许多程序以类似的方式使用。在我的系统上,我可以看到/tmp/orbit-$USER
(Gnome 的 ORBit2 使用)和/tmp/.X11-unix/
(Xorg 和 X11)目录中有大量管道、呃、套接字。我确信还有其他目录,所以我认为你做的事情没有错。只是要做好准备,因为它是一个全球可写的位置,恶意进程可以劫持该位置(在写入之前验证权限)。
我还可以向$TMPDIR
那些使用pam_mktemp,因为该目录只有用户可访问。
答案2
SystemD 有点/run/user/$UID
强制性。
http://www.freedesktop.org/software/systemd/man/file-hierarchy.html
非特权写访问
非特权进程通常缺乏对大多数层次结构的写访问权限。
普通用户的例外是
/tmp
、、以及主目录(通常位于下面/var/tmp
)和/dev/shm
$HOME
/home
运行时目录$XDG_RUNTIME_DIR
(见下文/run/user
)用户的,都是可写的。仅对非特权系统进程而言
/tmp
,/var/tmp
和/dev/shm
是可写的。如果非特权系统进程需要在/var
或中拥有私有的可写目录/run
,建议在守护进程代码中删除权限之前创建它、在启动期间通过 tmpfiles.d(5) 片段创建它或通过RuntimeDirectory=
服务单元的指令创建它(有关详细信息,请参阅 systemd.unit(5))。
https://www.freedesktop.org/software/systemd/man/pam_systemd.html
如果尚不存在,
/run/user/$UID
则创建用户运行时目录或将其挂载为tmpfs
应用配额的新“ ”文件系统,并将其所有权更改为正在登录的用户。
答案3
创建具有唯一 ID 的目录 /tmp/service-$USER.id。例如,在 shell 中:
mktemp -d /tmp/service-"$USER".XXX