我正在尝试编写一个C程序,用于将内容从源文件复制到目标文件。我想检查错误,看看文件是否存在,如果用户可以读取它,然后试图复制它。
我使用unistd.h中的access()。
这是上下文,我有一个文件夹:

.
├── src.txt
├── test
└── test.c

C是我的程序,用于测试文件是否存在以及是否可以读取。
int main(){
        char* path = "src.txt";
        fprintf(stderr, "%d\n", access(path, F_OK));
        fprintf(stderr, "%d\n", access(path, R_OK));
        return 0;
}

在这个例子中,当SRC文件存在并且具有权限664时,结果应该是:
1
1

但实际产出是
0
0

即使使用绝对路径而不是指向src.txt的相对路径,也会得到相同的结果。让我不安的是,如果我试图打开文件,它会工作:
测试c
int main(){
        char* path = "src.txt";
        fprintf(stderr, "%d\n", access(path, R_OK));
        fprintf(stderr, "%d\n", access(path, F_OK));

        FILE *f = fopen(path, "r");

        if (!f) {
                fprintf(stderr, "File couldn't be opened.\n");
        } else {
                fprintf(stderr, "File successfully opened.\n");
                fclose(f);
        }

        return 0;
}

作为输出:
0
0
File successfully opened.

我肯定我漏掉了什么,但我看不出来是什么。

最佳答案

access(2)函数在成功时返回0。如果您没有所请求的权限,或者文件不存在,或者路径查找失败,它就会返回-1。请参见man page。它还将errno变量设置为适当的错误代码。因此,您看到的0的输出是正确的,因为您对所述文件具有读取权限。
另外,大多数系统在出错时调用return-1(例如read(2)open(2)write(2)等),并设置errno变量以反映发生的确切错误。为了在错误期间采取正确的操作,您需要检查errno变量的值。

10-04 16:28