2013-01-01 75 views
1

它好像不管我把作爲PERMS創建的文件具有相同的權限 - RWX R-X R-X創建文件並分配權限

我試過755和777和權限只是保持不變。

#include<stdio.h> 
#include<stdlib.h> 
#include<fcntl.h> 
#include<unistd.h> 
#include<sys/stat.h> 
#define PERMS 0777 

int main(int argc, char *argv[]) 
{ 
    int createDescriptor; 
    char fileName[15]="Filename.txt"; 

    if ((createDescriptor = creat(fileName, PERMS)) == -1) 
    { 
     printf("Error creating %s", fileName); 
     exit(EXIT_FAILURE); 
    } 

    if((close(createDescriptor))==-1) 
    { 
     write(2, "Error closing file.\n", 19); 
    } 

    return 0; 
} 
+0

您使用Turbo C++ IDE嗎? –

回答

5

我想你可能需要調用creat前更改的umask:

umask(0000); 

man 2 umask。默認的umask通常是0022,這會使0777和0755之間的差異消失。

+0

它現在可以工作,但不僅僅是新創建的文件。如果存在,O_CREAT應覆蓋文件。在這種情況下權限保持不變。 – John

+0

正確,這就是它的工作原理。在這種情況下,你需要使用'chmod'(或'fchmod')。 – Thomas

+0

請問你能解釋爲什麼它「繼承」前一個被覆蓋的同名文件的文件權限?我知道有一個結構包含了文件的模式。是否這個結構中的文件權限在文件被覆蓋時不會改變?還是有其他原因? – John

0

嘗試chmod功能。要獲得更多詳細信息,請右鍵單擊IDE並鍵入chmod

NAME

chmod - 一個文件的改變模式

概要:

#include <sys/stat.h> 
int chmod(const char *path, mode_t mode); 

說明

chmod()函數將更改S_ISUID, S_ISGID, [XSI] S_ISVTX,以及由path參數指向的路徑名所指定的文件的文件權限位與mode參數中的相應位進行比較。應用程序應確保進程的有效用戶標識符與文件的所有者相匹配,或者進程具有適當的權限才能執行此操作。

S_ISUID, S_ISGID, [XSI] S_ISVTX,和文件權限位在<sys/stat.h>.

描述如果調用進程不具有相應的權限,並且如果該文件的組ID不匹配補充組ID的有效組ID或一個如果該文件是常規文件,則在從chmod()成功返回時,文件模式下的位S_ISGID(正在執行的set-group-ID)應該被清除。

其他實現定義的限制可能會導致模式中的S_ISUID and S_ISGID位被忽略。

對調用chmod()時打開的文件的文件描述符的影響是實現定義的。

成功完成後,chmod()將標記爲更新文件的st_ctime字段。

返回值

成功完成後,0應退還;否則,應返回-1,並設置錯誤號以指示錯誤。如果返回-1,則不會更改文件模式。 更多信息可在this鏈接找到。

相關問題