为什么open()用错误的权限创build我的文件?

我正在尝试从文件中读取一些文本,并使用open()read()write()将其写入另一个文本。

这是我open()的文件写入(我想创build一个新的文件,并写入它):

 fOut = open ("test-1", O_RDWR | O_CREAT | O_SYNC); 

这是设置文件权限的东西,我根本不明白。 这是ls -l的输出:

 ---------T 1 chaitanya chaitanya 0 2010-02-11 09:38 test-1 

即使读取权限被locking。 我试图寻找这个,但无法find任何东西。 奇怪的是, write()仍然成功地写入数据到文件。

另外,如果我执行“chmod 777 test-1”,事情就会重新开始。

有人可以让我知道我公开的电话中哪里出错吗?

谢谢!

为了您的参考,我已经粘贴了下面的完整程序:

 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h> int main () { char buffer[512], ch; int fIn, fOut, i; ssize_t bytes; FILE *fp = NULL; //open a file fIn = open ("test", O_RDONLY); if (fIn == -1) { printf("\nfailed to open file."); return 1; } //read from file bytes = read (fIn, buffer, sizeof(buffer)); //and close it close (fIn); printf("\nSuccessfully read %d bytes.\n", bytes); //Create a new file fOut = open ("test-1", O_RDWR | O_CREAT | O_SYNC); printf("\nThese are the permissions for test-1\n"); fflush(stdout); system("ls -l test-1"); //write to it and close it. write (fOut, buffer, bytes); close (fOut); //write is somehow locking even the read permission to the file. Change it. system("chmod 777 test-1"); fp = fopen ("test-1", "r"); if (fp == NULL) { printf("\nCan't open test-1"); return 1; } while (1) { ch = fgetc(fp); if (ch == EOF) break; printf("\n%c", ch); } fclose (fp); return 0; } 

开放()采取第三个参数,这是权限的集合,即

 open(filename, O_RDWR|O_CREAT, 0666) 

0666是一个八进制数字,即6个中的每一个对应三个许可位

6 = rw

7 = rwx

这是一个典型的陷阱。 编译器允许你离开权限参数,因为当你打开一个现有的文件权限位是没有意义的。 但是当你创build一个文件的时候你忘记了这个参数,你会得到一组随机的权限,例如0000(—)。

阅读http://linux.die.net/man/2/open似乎你错过了打开的;mode参数:

模式必须在O_CREAT位于标志中时指定,否则将被忽略。 参数模式指定在创build新文件的情况下使用的权限。

这个问题最近帮我解决了,所以我想尽我所能增加更多的深度。 就像之前说过的,你错过了open()的第三个参数。 但是,您看到的权限不是随机的; 他们来自堆栈。 看下面的代码片段:

  asm("push $0"); asm("push $0"); asm("push $0"); fd = open("base", O_RDWR|O_CREAT); 

请注意以下结果:

  ----------. 1 user user 4 Feb 26 08:21 base 

让我们把第一次推到1,即执行权限:

  asm("push $1;push $0;push $0"); fd = open("base", O_RDWR|O_CREAT); 

我们得到:

  ---------x. 1 user user 4 Feb 26 08:25 base 

更改推到4,即读取权限,并混淆了其他两个值:

  asm("push $4;push $5;push $6"); fd = open("base", O_RDWR|O_CREAT); 

我们得到:

  -------r--. 1 user user 4 Feb 26 08:27 base 

因此,我们可以看到popup堆栈的第三个值(首先被推送)是真正重要的。 最后为了好玩,我们可以尝试5和50,分别导致:

  -------rx. 1 user user 4 Feb 26 08:27 base ----rw----. 1 user user 4 Feb 26 08:28 base 

希望这增加了一些清晰度!

其实umask()只会过滤权限,不会设置它们。 典型的umask()值是0002 (“不要放弃对世界的写入权限”),如果你的模式值在open( "file", O_CREAT, 0777)给予所有权限,结果文件将有775它的困惑。

这个问题并不严格相关,但接受的答案可以用这个澄清点:

rwx和它的数字表示之间有一个关系,可以通过把一个字母的存在看作一个二进制1来看,而把它看作是一个二进制0。

例如

 rwx <--> 111 (binary) <--> 7 (octal) r-- <--> 100 (binary) <--> 4 (octal) -wx <--> 011 (binary) <--> 3 (octal) 

作为进一步的附录,您现在可以考虑chmod命令:

chmod 777 filename.extension – > rwxrwxrwx权限

 777 <--> 111 111 111 <--> rwx rwx rwx 

或者:chmod 654 filename.extension – > rw-rxr–

 654 <--> 110 101 100 <--> rw- rx r-- 

希望这是信息!

你可以调用umask(0); 系统调用之前使用open(); 系统调用来设置你的select权限,以正确的文件。

这是一个古老的线程,但我认为人们应该知道“sys / stat.h”库。 这包括一些用于设置权限位的符号常量。

例如:打开一个为用户启用读/写权限的文件

 #include <fcntl.h> #include <sys/stat.h> open("Your/File/Path", O_RDWR | O_CREAT, S_IWUSR | S_IRUSR); 

哪里:

 S_IWUSR // Sets the Users Write bit S_IRUSR // Sets the Users Read bit 

这个图书馆包括一些其他人,我不会在这里列出他们,但你可以在这里读到这里 。

当然你可以放八进制值来设置这些位,但有些人可能会认为这是不好的编码习惯。