0

我有一个提升的进程,我想确保它创建的 SQLite 文件可以被其他进程读取。由于某种原因umask似乎没有做我想要的(设置进程创建的sqlite文件的权限)。

我正在使用预写日志记录,因此-wal除了-shm数据库文件之外还创建了文件。我希望所有 3 都正确 chmodded。

我想知道在创建 SQLite 文件之后是否有可能进入chmod

可能的方法:

  1. touchSQLite 尝试创建它们之前的所有 3 个文件,然后 chmod 并希望掩码保持不变
  2. 在创建文件时拦截chmod它们。
  3. 弄清楚如何开始umask工作。
  4. 神秘选项四。

最好的方法是什么?

方法问题:

  1. SQLite 可以吗?
  2. 我们知道何时创建所有 3 个文件吗?是否有某种回调我可以给函数指针?我们知道相同walshm文件是否永远存在吗?还是它们被删除并重新创建?
4

1 回答 1

1

您可以在打开数据库文件之前触摸它。(当您使用sqlite3命令行工具打开一个新文件,但除了begin;and之外什么都不做commit;,SQLite 本身将创建一个零大小的文件。)

如果要拦截文件操作,可以注册自己的VFS

-wal和文件是动态创建的-shm,但 SQLite 会给它们与主数据库文件相同的权限位。robust_open()的评论os_unix.c说:

如果文件创建模式“m”为 0,则将其设置为 SQLite 的默认值。默认值为由系统 umask 修改的 SQLITE_DEFAULT_FILE_PERMISSIONS(通常为 0644)。如果 m 不为 0,则使文件创建模式完全为 m,忽略 umask。

仅当创建 -wal、-journal 和 -shm 文件时,m 参数才非零。我们希望这些文件具有与其原始数据库完全相同的权限,不受 umask 的影响。这样,如果数据库文件是-rw-rw-rwor -rw-rw-r-,并且事务崩溃并留下热日志,那么任何能够写入数据库的进程也将能够恢复热日志。

于 2012-09-27T06:40:02.640 回答