为什么以下read()调用代码会停止?

时间:2016-09-27 02:34:50

标签: c gcc

没有使用gcc -Wall -W -g3< inputfile.c >编译警告 但是二进制文件没有显示任何内容而且没有获得$ prompt。 gcc版本4.9.2(Ubuntu 4.9.2-10ubuntu13)。我是从Keith Haviland的“Unix系统编程”一书中读到的。 read()调用的示例。

~/.ssh/config

我无法理解gdb显示的内容。 fi.txt只包含一个单词,Hello。

    #include<stdio.h>
    #include<stdlib.h>
    #include<fcntl.h>
    #include<unistd.h>
    #define BUFSIZE 512
    int main()
    {
    char buffer[BUFSIZE];
    int fd;
    ssize_t nread;
    long total = 0;

    if( (fd = open("fi.txt", O_RDONLY) == -1)){
        printf("error in opening file\n");
        exit(1);
        }
    while( (nread = read(fd, buffer, BUFSIZE))>0)
    total += nread;
    printf("Total characters: %ld\n", total);
    exit(0);
}

它继续打印类似的消息。

3 个答案:

答案 0 :(得分:3)

你在这里放错了括号:

rem

导致fd被设置为0,而不是open的返回值。因此,您实际上是从fd 0(STDIN)读取。

应该是:

if( (fd = open("fi.txt", O_RDONLY) == -1)){

答案 1 :(得分:1)

我认为你只是犯了一个低级错误:

更改此行代码:

if( (fd = open("fi.txt", O_RDONLY) == -1)){

if( (fd = open("fi.txt", O_RDONLY)) == -1){

然后你会得到正确的结果。

因为你的代码会使fd = 0,而0是stdin,所以progrm总是等你的输入。

答案 2 :(得分:0)

[评论太长了:]

参考最佳实践调试:如果看似简单的代码失败,请寻找隐藏的不必要的复杂但必要的构造并将它们分开。在你展示的情况下,有两个这样的结构:

  1. 打开文件:

      if ((fd = open("fi.txt", O_RDONLY) == -1)) 
      {
        perror("open() failed");
        ...
    

    这可以写成:

      fd = open("fi.txt", O_RDONLY);
      if (fd == -1) 
      {
        perror("open() failed");
        ...
    
  2. 从文件中读取:

      while ((nread = read(fd, buffer, BUFSIZE)) > 0)
    

    可写:

      nread = read(fd, buffer, BUFSIZE);
      while(nread > 0)      
      {
        ...
        nread = read(fd, buffer, BUFSIZE);
      }
      if (nread == -1) /* Add as much error checking as possible. */
      {
        perror("read() failed)");
      }
    

    或者更多只使用一次调用read(),但分离错误处理,以这种方式增加if的费用:< / p>

    do 
    {
      nread = read(fd, buffer, BUFSIZE);
      if (nread == -1) /* Add as much error checking as possible. */
      {
        perror("read() failed)");
      }
      else
      {
        ...
      }
    } while (nread > 0);