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
",__FILE__,__LINE__) ;
    fflush ( stdout ) ;
    while (1)
    {
         num_read = fread(buf_read, 1, 1, STDIN_FILENO);------这里应该是stdin
        if (num_read)
        {
            printf("%s %d
",__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
    
原文地址:https://www.cnblogs.com/zongzi10010/p/10539837.html