gpt4 book ai didi

c - 在 C 中使用 open() 函数创建的文件的默认访问模式是什么?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:56:00 25 4
gpt4 key购买 nike

我写了下面的 C 代码来打开一个不存在的文件。

#include<stdio.h>
#include<fcntl.h>
#include<unistd.h>
#include<sys/stat.h>
#include<sys/types.h>

int main(){
int fd = open("test.c",O_WRONLY | O_CREAT);
printf("%d\n",fd);
close(fd);
}

虽然当我运行 ls -l 命令时 umask 设置为 0002,但我得到了我创建的文件的以下输出。

-r--rws--T 1 urohit011 urohit011     0 Feb 14 22:35 test.c

当我使用新文件名运行代码时,访问模式发生了变化。我有两个问题。

  • 该文件的默认访问模式不应该是 664,因为 umask是 0002 吗?
  • 为什么在使用新文件运行代码时访问模式会发生变化姓名?

最佳答案

模式/权限位由 open 的第三个参数指定称呼。您没有提供该参数,当使用 O_CREAT 时,这是一个静默编程错误:

This argument (mode) must be supplied when O_CREAT or O_TMPFILE is specified in flags; if neither O_CREAT nor O_TMPFILE is specified, then mode is ignored.


Shouldn't the default access mode of that file be 664 since the umask is 0002

必须明确提供默认模式:

open("test.c",O_WRONLY | O_CREAT, 0666)
^^

Why the access mode changes when the code is run with a new file name ?

open 是一个 variadic function接受 2 个或更多参数:

int open(const char* file, int flag, ...);

因此,如果没有提供任何值,函数的第三个参数将被初始化为一个不确定的值。如果只提供 2 个参数,则不会出现编译器错误。另一方面,始终为 open 调用提供第三个参数并不是错误。

关于c - 在 C 中使用 open() 函数创建的文件的默认访问模式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42232586/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com