STDIN_FILENO和stdin


title: STDIN_FILENO和stdin
date: 2019/03/15 22:03:22
toc: true
---

STDIN_FILENO和stdin

https://blog.csdn.net/yeyuangen/article/details/6781999

引入

今天想写一个程序,使用串口非阻塞,然后使用fread来从标准输入中读取,代码差不多是这样的

int main(int argc, char **argv)
{
    char  buf_read[100];
    int num_read;
    setvbuf(STDIN_FILENO, (char*)NULL, _IOFBF, 0);------这里应该是stdin
    printf("%s %d\n",__FILE__,__LINE__) ;
    fflush ( stdout ) ;
    while (1)
    {
         num_read = fread(buf_read, 1, 1, STDIN_FILENO);------这里应该是stdin
        if (num_read)
        {
            printf("%s %d\n",__FILE__,__LINE__) ;
            fflush ( stdout ) ;
        }
    }
}

但是一直提示段错误,后来经过大神指点发现了应是stdin而不是STDIN_FILENO,其实网上的代码都是写的stdin,只是自己没注意,觉得两个是一样的,其实仔细一看两个是完全不同结构的

总结

  • stdin类型为 FILE*,fread、fwrite、fclose
  • STDIN_FILENO类型为 int,read、write、close
typedef struct _iobuf
{
    char*   _ptr;
    int _cnt;
    char*   _base;
    int _flag;
    int _file;
    int _charbuf;
    int _bufsiz;
    char*   _tmpfname;
} FILE;

#define STDIN_FILENO    0
#define STDOUT_FILENO   1
#define STDERR_FILENO   2
  • 输入流被称为 standard input,输出流被称为 `standard output 错误流被称为 standard error 。这些名词通常简写为符号,用于引用这些文件,它们是 stdin, stdout, 和 stderr.

    这些符号中,每一个都是 stdio(3) 中的一个宏,类型是指向 FILE 的指针,可以用于类似 fprintf(3) 或 fread(3) 等函数中

  • 与流关联的整数形式的文件描述符分别是 0,1 还有 2。预处理器符号
    STDIN_FILENO,STDOUT_FILENO STDERR_FILENO分别以它们为值.

  • 转换

    fileno(stdin) = STDIN_FILENO = 0
    fileno(stdout) = STDOUT_FILENO = 1
    fileno(stderr) = STDERR_FILENO = 2

猜你喜欢

转载自www.cnblogs.com/zongzi10010/p/10539837.html