gpt4 book ai didi

c - umask 和 chmod 意外行为

转载 作者:太空宇宙 更新时间:2023-11-04 09:58:10 25 4
gpt4 key购买 nike

我正在尝试编写使用 umaskchmod 系统调用更改文件权限的简单程序,但文件权限没有按预期更改。

这是我试过的:

  • 设置umask为0;
  • 如果文件不存在,则通过使用 O_CREAT 标志的open 系统调用创建它,然后将特权设置为通过命令行参数传递的模式 ;
  • 如果文件已经存在,通过chmod 系统调用改变它的权限。
#define _XOPEN_SOURCE 700
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <unistd.h>

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define check_error(expr, userMsg) \
do { \
if (!(expr)) { \
perror(userMsg); \
exit(EXIT_FAILURE); \
} \
} while(0)

int main(int argc, char** argv)
{
check_error(3 == argc, "use: ./umask path mode");

mode_t oldUmask = umask(0);
long mode = strtol(argv[2], NULL, 8);

int fd = open(argv[1], O_WRONLY|O_CREAT|O_EXCL, mode);
if (-1 == fd) {
if (EEXIST == errno) {
printf("[file already exists]\n");
check_error(-1 != chmod(argv[1], mode), "chmod failed");
} else {
perror("open failed");
exit(EXIT_FAILURE);
}
} else {
close(fd);
}

umask(oldUmask);

exit(EXIT_SUCCESS);
}

编译后我尝试了:

./umask 1.txt 0744

预期权限为 -rwxr--r--,但在

之后
ls -l 

我得到:

-rwxrwxrwx 1 root root    0 окт 19 14:06 1.txt

再次,之后

./umask 1.txt 0744

这次我预计 chmod 会在内部更改现有文件的权限,但在列出后我得到了相同的结果:

[file already exists] 
-rwxrwxrwx 1 root root 0 окт 19 14:06 1.txt

umaskchmod 都未能按预期设置权限。怎么了?

最佳答案

我创建和测试程序的文件是在 Windows 主机和 Linux 虚拟机之间的共享文件夹中创建的。我已经从 Linux 启动该程序,试图更改我不是其所有者的文件的权限 - 它是 Windows 主机,这就是为什么它不允许我更改权限。

关于c - umask 和 chmod 意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58463583/

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