2013-01-01 76 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链接找到。

相关问题