c - 未使用 open 系统调用正确设置文件权限

标签 c linux file-permissions system-calls systems-programming

我目前正在学习“Linux 编程接口(interface)”,在第 4 章中有一个练习,我们必须重写“tee”命令。我已经这样做了,但无论我做什么,我的文件权限(保存在 mode_t 类型的变量中)都没有正确设置。

即,我有以下代码:

filePerms = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH; // filePerms is mode_t
foutputFd = open((argc == 2) ? argv[1] : argv[2], flags, filePerms); // don't worry about the ternary here
if (foutputFd == -1)
  errExit("opening file %s", (argc == 2) ? argv[1] : argv[2]); // ...or here.

总而言之,目录中的文件将具有 rw-r--r-- 权限,而不是由上面的标志

现在,我做了一些研究,看起来传递给 open()mode 参数指定了允许的最大权限数,然后无论如何它都会在稍后更改(不知何故)。如果是这样的话,为什么会这样呢?为什么要让我在公开调用中指定权限?

任何帮助将不胜感激,我想继续阅读这本书,但这个问题有点令人沮丧,哈哈(我根本没有在书中找到它的解释)。

最佳答案

此更改通常是由 umask 设置引起的。如果您事先在 shell 中使用 umask 0 调整了它,则此代码应该按预期工作。

关于c - 未使用 open 系统调用正确设置文件权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20599314/

相关文章:

C 数组和指向数组的指针

c - 如何检查字符数组中是否存在特定字符

计算克隆函数的可变参数数量

linux - 设置文件夹和文件权限

macos - 从AFS挂载的主目录进行SSH公/私钥身份验证

c - fork 后强制子进程退出

c - 我需要创建一个循环来找到最年长的学生并打印他的 ID

c++ - pthread_create 错误 :

linux - 如何退出一个 while 循环,该循环使用数字和一个不会弄乱数学的字符

c - 如何从已存在的文件中复制权限?