为什么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
这个图书馆包括一些其他人,我不会在这里列出他们,但你可以在这里读到这里 。
当然你可以放八进制值来设置这些位,但有些人可能会认为这是不好的编码习惯。