STDOUT_FILENO STDIN_FILENO STDERR_FILENO 和stdin stdout stderr区别

本文介绍了STDOUT_FILENO、STDIN_FILENO和STDERR_FILENO作为整型常量在标准IO中的作用,以及它们与stdin、stdout、stderr之间的区别。通过示例代码展示了如何使用它们进行数据的读写操作,并通过重定向演示了它们在不同场景下的行为。
1> STDOUT_FILENO、 STDIN_FILENO、 STDERR_FILENO是整型的

在/usr/include/unistd.h中有如下定义:


​#defineSTDIN_FILENO

​0

​#defineSTDOUT_FILENO

​1

​#defineSTDERR_FILENO

​2

​2> stdin、 stdout、 stderr是FILE*类型的

在Linux手册SYNOPSIS 中可以看到如下内容:    

 #include        

extern FILE *stdin;       

extern FILE *stdout;       

extern FILE *stderr;

3> fprintf函数原型为:int fprintf(FILE *stream, const char *format, ...);  

可以看到第一个参数是FIEL*类型的,所以在fprintf()中要把信息输出到屏幕,第一个参数要用stdout ,不能用STDOUT_FILENO

4>STDOUT_FILENO、 STDIN_FILENO的运用

===================================================

#include

#define SIZE 100

int main(void)

{

​        int n;

        char buf[SIZE];

        while(n=read(STDIN_FILENO,buf,SIZE))   //读取标准输入到buf中,返回读取字节数。

      {

                if(n!=write(STDOUT_FILENO,buf,n)) 把buf 写到标准输出中

                        perror("write error");

        }

        if(n<0) perror("read error");   

        return 0;

}

===================================================

如果按照常规的使用方法:

fan@fan:~/arm$ gcc -o app stdout.c 

fan@fan:~/arm$ ./app

fdfe

fdfe

fefefef

fefefef

//输入一行,马上输出一行,也就是按照原样输出

===================================================

使用重定向来运行

fan@fan:~/arm$ ./app> data

fefe

fdadfdf

adfdfef

//输入的字符串并不是输出到终端,而是输出到data文件中。

===================================================

fan@fan:~/arm$ ./app data

fan@fan:~/arm$ 

//这一句相当于把stdout.c复制到data中去

===================================================

STDOUT_FILENO和STDIN_FILENO在默认的情况下是终端
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值