C语言中带有open()函数的文件权限的意外结果(-wS-wx-T)

时间:2017-02-01 20:56:11

标签: c linux unix

我写了这个程序来打开一个文件。在我看到此权限(-wS-wx - T)-std=c99

之前,一切正常

open.c

ls -lh

我很好地编写了程序,没有收到任何错误或警告。

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

#define FILE "foo.txt"

int main()
{
        int fd;
        int errnum;

        fd = open(FILE, O_RDWR | O_CREAT);

        if(fd == -1)
        {
                printf("[error] The file hasn't opened.\n");
                perror("Error printed by perror");
        }else {
                printf("The process was succeeded\n");
        }

        return 0;
}

我从来没有见过这样的许可。什么是'S'和'T'的含义 文件权限部分? (注意:我在评论中回答了这个问题。)

2 个答案:

答案 0 :(得分:8)

如果您在传递给O_CREAT的标记中包含open(),则 必须 使用该函数的三个arg形式,数字文件模式作为第三个参数。此要求记录在the Linux manual page for the function中(强调添加):

  

mode参数指定在a时应用的文件模式位   新文件已创建。 必须在O_CREATO_TMPFILE时提供此参数   flags 中指定了O_CREAT;如果O_TMPFILES_IRUSR | S_IWUSR | S_IRGRP都不是   指定,然后忽略模式。

您真正想要的模式不清楚,但也许0640适合(== {{1}};为所有者读取和写入,只读给所有者的群组,无权限对于任何其他人。)

答案 1 :(得分:0)

我发现了两个不同的open函数定义,你可以在linux终端中看到它们man 2 openman 3 open

Linux程序员Manuel的

man 2 open POSIX程序员的Manuel man 3 open

如果您使用 POSIX程序员的Manuel 定义(问题中的示例代码)来打开功能,您可以获得意外的权限(例如-wS-wx-T)。
如果您使用 Linux Programmer的Manuel 定义(下面的示例代码),您可以获得定期许可。
我不确定这是真的,但我注意到了。
如果我有错,请纠正我。

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

    int main(int argc, char *argv[])
    {

            int fd;

            if(argc != 2){
                    printf("[usage] %s <file_name>\n", argv[0]);
                    exit(0);
            }

            fd = open(argv[1], O_RDWR | O_APPEND | O_CREAT, S_IRWXU | S_IRWXG | S_IROTH);
        if(fd == -1){
                perror("[error] open function\n");
                exit(-1);
        }else{
                printf("[succeeded]\n");
        }

        return 0;
}