0

我有应该在多个平台上工作的 Qt 应用程序。这些平台之一是 Linux。我是 Linux 世界的新手。

我的应用程序需要创建和管理一组数据文件。在阅读了一些关于 linux 目录结构的链接后,我决定将数据文件存储在 /var/myapp 目录及其子目录中。

这是问题所在:如果我的应用程序在没有超级用户权限的情况下运行,那么它无权创建 /var/myapp 目录。即使我将手动创建目录(使用 sudo),我的应用程序也无权在其中写入文件。

是否可以从 Qt 代码临时提升应用程序的权限以创建 /var/myapp 目录并在那里写入文件?

或者可能在 Linux 目录结构中的另一个位置默认可用于存储应用程序的数据文件?

4

2 回答 2

3

只有 root 可以在 /var 中创建目录。如果您的应用程序需要 /var 下的子目录,则需要在安装期间创建它(通常以 root 权限运行),并适当地对其进行 chmod:为可能运行您的应用程序的用户创建一个组,放入/var/myapp该组,然后 chmod它到770;或者只是 chmod 目录以777允许每个人访问它。如果您想阻止普通用户写入,请改用 755 或 750。(对于数据文件,不要设置执行位:这里的适当权限是 666/660/644/640)。代替八进制三元组,您可能更喜欢 chmod 更复杂的助记符语法,例如为拥有用户 ( ) 和组 ( )chmod ug+x filename添加 ( +) 执行位 ( x) 。filenameug

但是,/var 不一定是最佳选择:/var 通常用于易失性数据(临时文件等),以及预计会频繁更改的内容(邮件、日志文件等)。其他数据应进入:

  • /usr/share/{appname}用于系统范围的数据文件和资源
  • /etc/{appname}用于系统范围的配置文件
  • ~/.{appname}(旧约定)或~/.config/{appname}每个用户的配置文件
  • /var/tmp/{appname}对于临时文件

此外,您想让/usr前缀可配置;大多数发行版都保留/usr包管理的文件,除了/usr/local,它镜像/usr发行版外安装(因此在这种情况下,您的系统范围的资源进入/usr/local/share而不是/usr/share)。

于 2012-08-17T11:57:29.697 回答
1

您可以在没有安装脚本的情况下分发它,但您必须告诉他们以 root 身份运行一次......或者如果应用程序的系统范围数据文件不存在,则使用 gksudo/kdesudo 以 root 身份运行该应用程序。
不过,习惯是制作一个包含所有必要文件的包(.deb、.rpm,甚至是用户自己提取的 .tar.gz)。

但是 linux(以及 OS X)是多用户系统。您确定您的文件属于 /var 或 /usr 吗?如果您说它们是在运行时创建的,它们不依赖于用户输入吗?在这种情况下,您需要将它们放在用户主目录 (getenv("HOME")) 内的某个目录中。

于 2012-08-17T12:20:18.777 回答