使用open和fdopen

时间:2016-11-02 08:09:32

标签: c

我将open()O_RDWR一起使用,然后将fdopen()中的描述符与"r+"一起使用。我首先检查该文件是否存在于access(),然后检查open()是否返回-1,然后检查FILE *fp设置的fdopen()是否为NULL }。

现在每当我使用fgets()fgetc()fp之类的任何功能时,程序都会在我的终端中挂起。我没有编译器警告。有什么想法吗?

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>

int main(int argc, char **argv) {
    char buffer[512];
    int file_descriptor;
    FILE *file;

    if (argc != 2) {
        puts("ERROR: Missing argument");
        exit(0);
    }
    else if (access(argv[1], F_OK) == -1) { // Check if file exists
        puts("ERROR: File does not exist");
        exit(0);
    } else if (file_descriptor = open(argv[1], O_RDWR) == -1) { // Check for open() failure
        puts("ERROR: Unable to open file using open()");
        exit(0);
    }

    file = fdopen(file_descriptor, "r+"); // Use descriptor

    if (file == NULL) {
        puts("ERROR: Unable to open file using fdopen()");
        fclose(file);
        exit(0);
    }

    // fscanf(file, "%c", stdout); // Hangs
    // fgets(buffer, sizeof(buffer), file); // Hangs
    printf("%c", fgetc(file)); // Hangs

    fclose(file);

    return 0;
}

2 个答案:

答案 0 :(得分:13)

表达式

file_descriptor = open(argv[1], O_RDWR) == -1

不能按预期工作,因为等于运算符==的赋值运算符高precedence。这意味着表达更像是

file_descriptor = (open(argv[1], O_RDWR) == -1)

这意味着您的file_descriptor将是01,具体取决于比较的方式。

您需要使用括号进行分配:

(file_descriptor = open(argv[1], O_RDWR)) == -1

答案 1 :(得分:6)

添加到其他答案。它是&#34;挂&#34;因为这个bug导致它实际上读取标准输入(文件描述符0)。尝试输入一些内容,它会读取它。