umask 和 chmod 意外行为

umask and chmod unexpected behaviour

我正在尝试编写使用 umaskchmod 系统调用更改文件权限的简单程序,但文件权限不会更改不出所料。

这是我试过的:

#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 主机,这就是为什么它不允许我更改权限.