umask 和 chmod 意外行为
umask and chmod unexpected behaviour
我正在尝试编写使用 umask 和 chmod 系统调用更改文件权限的简单程序,但文件权限不会更改不出所料。
这是我试过的:
- 将 umask 设置为 0;
- 如果文件不存在,则由 open 系统调用使用 O_CREAT 标志创建,然后权限设置为 mode 由命令行参数传递;
- 如果文件已经存在,通过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
umask 和 chmod 都未能按预期设置权限。怎么了?
我创建并测试程序的文件是在 Windows 主机和 Linux 虚拟机之间的共享文件夹中创建的。我从 Linux 启动程序,试图更改我不是其所有者的文件的权限 - 它是 Windows 主机,这就是为什么它不允许我更改权限.
我正在尝试编写使用 umask 和 chmod 系统调用更改文件权限的简单程序,但文件权限不会更改不出所料。
这是我试过的:
- 将 umask 设置为 0;
- 如果文件不存在,则由 open 系统调用使用 O_CREAT 标志创建,然后权限设置为 mode 由命令行参数传递;
- 如果文件已经存在,通过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
umask 和 chmod 都未能按预期设置权限。怎么了?
我创建并测试程序的文件是在 Windows 主机和 Linux 虚拟机之间的共享文件夹中创建的。我从 Linux 启动程序,试图更改我不是其所有者的文件的权限 - 它是 Windows 主机,这就是为什么它不允许我更改权限.