【发布时间】:2016-12-04 15:01:36
【问题描述】:
我正在为 C @ open SuSE jump 42.2 x64 中的 open() 函数编写一个小测试程序。
不幸的是,正在创建的文件获得了 -rwxrwxrwx 权限,尽管我在执行 umask(0);
后将 0644 交给了 open() 函数谁能告诉我,我做错了什么? (我从一本打开的书 (link) 中获得了示例代码。
这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <string.h>
#include <unistd.h>
int main(int argc, char** argv) {
/* Zugriffsrechte 644 */
mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH;
const char *new_file;
int file_descriptor;
/* Alle Zugriffsrechte der Einschraenkungsmaske erlauben */
umask(0);
/* Argument 2 der cmd line auswerten */
if (argv[1] == NULL) {
fprintf(stderr, "usage: %s datei_zum_oeffnen\n", *argv);
return EXIT_FAILURE;
}
new_file = argv[1];
file_descriptor = open(new_file, O_WRONLY|O_EXCL|O_CREAT, 0644);
/* or var mode instead of (0644) */
if (file_descriptor == -1) {
perror("Fehler bei open ");
return EXIT_FAILURE;
}
return (EXIT_SUCCESS);
}
无论哪种方式 - 将 0644 或变量“mode”作为 open() 的第三个参数都不能按预期工作,执行程序(作为普通用户)并提交文件名时的结果是:-rwxrwxrwx 和此外:该文件属于root:root而不是执行用户?!
我需要改变什么?
【问题讨论】:
-
提到 root 等表明您正在查看的文件不是程序创建的文件。如果您不是以 root 身份运行,那么您的程序不太可能(基本上不可能)创建 root 拥有的文件。文件是空的吗?如果在运行程序之前删除它并确认它已经消失,它会在程序运行后重新出现吗?如果您指定不同的名称,您会得到相同的结果吗?如果您指定
/tmp/test.file,您看到问题了吗?可执行文件的权限是什么? -
感谢您的回答。这种行为有点奇怪——我以普通用户身份执行程序,它创建了一个属于 root 的文件,但拥有世界的所有权限。 - 所以我能够删除它。该文件是空的和 0 字节 - 它只是创建的,所以我认为这是正确的。但是 - 将可执行文件复制到我的主目录 - 改变了这种行为,使整个事情按预期工作。 - 请参阅下面的答案。