2016-12-04 77 views
1

我正在为C @ open SuSE leap 42.2 x64中的open()函数编写一个小测试程序。nfs上的奇怪的系统调用语义mount

不幸的是,正在创建的文件获取-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或变量“模式”的open()的第三个参数。不按预期工作,执行程序(正常用户)和交付文件名时的结果是:-rwxrwxrwx,此外:文件属于root:root而不是执行用户?

必须改变吗?

+0

提及根等表明你正在看的文件不是程序创建的文件。如果你没有以root身份运行,你的程序创建root拥有的文件是不太可能的(基本上不可能)。该文件是否为空?如果在运行程序之前将其删除,并且验证它已经消失,那么在程序运行后它会重新出现吗?如果你指定一个不同的名字,你会得到相同的结果吗?如果你指定'/ tmp/test.file'你会发现问题吗?可执行文件的权限是什么? –

+0

感谢您的回答。这种行为有点奇怪 - 我以普通用户身份执行该程序,并创建属于根的文件,但拥有世界的所有权利。 - 所以我可以删除它。该文件是空的和0字节 - 它只是创建,所以这是我认为是正确的。但是 - 将可执行文件复制到我的主目录 - 改变了这种行为,使整个事情按预期工作。 - 请参阅下面的答案。 – Ben

+0

相关:[如何在NTFS(或FAT32)分区上使用'chmod'?](http://askubuntu.com/questions/11840/how-do-i-use-chmod-on-an-ntfs- or-fat32-partition) –

回答

2

已解决。

失败是使用NetBeans 8.2编译它。 由NetBeans创建的文件夹和文件属于根目录 - 在我的主目录中创建相同的.c文件,并将其编译为完美的。

补充: NetBeans是作为root运行。 我的工作区创建的文件夹是一个NTFS驱动器,在用户访问启动期间挂载 - 但整个驱动器首先属于根。我99%相信这是导致我错误地假设NetBeans创建文件夹和文件的权限不正确。

+1

非常好奇。如果NetBeans以root身份运行,我将永远不会使用它。以root身份进行实验并不安全。我确实想知道IDE是否是麻烦的一部分,但我不想不必要地抛出错误。 –

+0

@JonathanLeffler NetBeans不需要root ... – user268396

+0

@ user268396:好。它怎么会搞砸,以便它以root身份运行?我假设它不是以'sudo netbeans'或类似的方式运行,尽管这可能不是一个安全的假设。 (我不是IDE的粉丝,所以我不知道从我自己的经验。) –