读取文件描述符HANGS

时间:2016-04-16 08:44:11

标签: c++ c filesystems system

我有一个非常简单的源读取文件描述符挂起。 任何人都可以注意到代码有问题吗?

第一个是有问题的来源,第二个是在网络上找到的工作来源。两个来源几乎相同。

  • 第一个来源

    #include <sys/types.h>
    #include <sys/stat.h>
    #include <unistd.h>
    #include <fcntl.h>
    #include <stdio.h>
    
    int main(int argc, char ** argv) {
         int n, in;
         char buf[1024];
    
        if ((in = open(argv[1], O_RDONLY)<0)) {
            perror(argv[1]);
            return -1;
        }
    
        while((n = read(in, buf, sizeof(buf))) > 0 ) { //HANGS at THIS LINE!!!!!!!!!!!
            printf("TEST\n");
        }
    
        close(in);
    
        return 0;
    }
    
  • 第二个工作来源来自网上

    /*
     * ============================================================================
     *  Name        : sp_linux_copy.c
     *  Author      : Marko Martinović
     *  Description : Copy input file into output file
     *  ============================================================================
     **/
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <fcntl.h>
    #include <errno.h>
    #include <sys/types.h>
    #include <unistd.h>
    
    #define BUF_SIZE 8192
    
    int main(int argc, char* argv[]) {
    
        int input_fd;    /* Input and output file descriptors */
        ssize_t ret_in;    /* Number of bytes returned by read() and write() */
        char buffer[BUF_SIZE];      /* Character buffer */
    
        /* Create input file descriptor */
        input_fd = open (argv [1], O_RDONLY);
        if (input_fd == -1) {
            perror ("open");
            return 2;
        }
    
        /* Copy process */
        while((ret_in = read (input_fd, &buffer, BUF_SIZE)) > 0){
            printf("TEST\n");
        }
    
        /* Close file descriptors */
        close (input_fd);
    }
    

1 个答案:

答案 0 :(得分:5)

有趣的巧合是,你正在阅读stdin。这是因为在您的if(in = ...中,您错放了一些括号。

正在发生的事情是首先评估open(argv[1], O_RDONLY)<0,并将结果放入in。由于open()的结果不小于零(成功打开),in变为0. stdin是filedescriptor的名称,为零(在大多数系统上)。所以它是一个有效的文件描述符,阅读非常乐意从中读取。在您在控制台中键入内容之前,它不会得到任何内容。

快速修复:

if ( (in = open(argv[1], O_RDONLY)) < 0) {