• 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
      
  • 相关阅读:
    在windows下拆卸Linux就是这么俭朴
    打点Linux下永中Office和桌面殊效的冲突
    Banshee 0.11.4
    ubuntu8.0中文输入法
    RedFlag 6.0 硬盘安置我解
    阅读器和把持体系和用户的IQ
    初试Fedora,最后还是Xubuntu
    VMware中放置Ubuntu后鼠标滚轮标题问题办理
    GNOME 的文件经管器将片面支撑标签式阅读
    ATI显卡开启fedora9的3d后果的一些条记
  • 原文地址:https://www.cnblogs.com/zongzi10010/p/10539837.html
Copyright © 2020-2023  润新知