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

我试图从一个文件读取一些文本,并写到另一个使用 open()read()write()

这是我的 open(),用于文件写入(我想创建一个新文件并写入其中) :

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

这是对我完全不理解的东西设置文件权限。这是 ls -l的输出:

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

甚至连读权限都被锁定了。我尝试搜索这个,但是找不到任何东西。 奇怪的是,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;
}
107727 次浏览

Open ()接受第三个参数,即权限集,即。

open(filename, O_RDWR|O_CREAT, 0666)

0666是一个八进制数字,即每个6对应三个权限位

6 = rw

7 = rwx

前三位表示所有者权限,后三位表示组权限,下一位表示全局权限 第一个数字-表示文件或目录 这里我们使用0表示文件

这是个典型的陷阱。编译器允许您不使用权限参数,因为当您打开现有文件时,权限位没有意义。但是当您在创建文件时忘记参数时,您将获得一组随机的权限,例如,在您的示例中为0000(—— -)。

读取 http://linux.die.net/man/2/open时,你似乎错过了 open 的 mode参数:

当 O _ CREAT 在标志中时,必须指定 mode,否则忽略。 参数模式指定在创建新文件时使用的权限。

这个问题最近帮助了我,所以我想做我的部分,增加一点深度,什么是正在发生的事情。就像之前说的,你错过了 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

让我们将第一个 push 改为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

因此,我们可以看到从堆栈中弹出的第三个值(首先推出)才是真正重要的。最后,为了好玩,我们可以尝试5和50,结果分别是:

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

希望这能让你更清楚!

您可以在使用 open();系统调用之前调用 umask(0);系统调用,以正确设置文件的选择权限。

实际上,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.xml —— > rwxrwxrwx 权限

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

或者: chmod 654 filename 扩展名—— > rw-r-x-r ——

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

希望这能给你提供些信息!

这是一个老线程,但是我认为人们应该注意“ 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

这个图书馆包括一些其他的,我不会在这里列出所有的,但是你可以阅读所有的 给你

当然,您可以输入八进制值来设置这些位,但是有些人可能会认为这是不好的编码实践。