2016-12-04 102 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的粉絲,所以我不知道從我自己的經驗。) –