首先注意文件描述符、三个数字0,1,2和文件指针的关系。
运行任何程序之前,都会首先打开三个文件:一个用于输入,一个用于输出,一个用于错误输出,这三个文件打开后形成的文件结构分别用文件指针stdin,stdout,stderr进行指向。这样会形成三个文件描述符0,1,2。具体哪个是0,哪个是1,哪个是2,那要根据打开顺序。一般是按照“标准输入-标准输出-标准错误”这个顺序来打开的,所以我们常说标准输入就是文件描述符0,输出是1,错误是2,为了增强可移植性,linux的unistd.h中对这三个描述符进行了宏定义,所以有STDIN_FILENO - 0, STDOUT_FILENO - 1, STDERR_FILENO - 2。
stdio.h中有指针定义:
unistd.h中有如下宏定义:
重定向最常用的两个:“>”,“<”,分别为输出重定向和输入重定向。
进阶一步:追加的输出重定向:“>>”。
思考上述重定向工作:输出重定向就是以只写方式打开文件,将标准输出stdout(文件描述符1)写入该文件,注意,标准错误信息stderror(2)不会写入该文件。
输入重定向则是只读方式打开并读取文件到标准输入stdin(0)
运行任何程序之前,都会首先打开三个文件:一个用于输入,一个用于输出,一个用于错误输出,这三个文件打开后形成的文件结构分别用文件指针stdin,stdout,stderr进行指向。这样会形成三个文件描述符0,1,2。具体哪个是0,哪个是1,哪个是2,那要根据打开顺序。一般是按照“标准输入-标准输出-标准错误”这个顺序来打开的,所以我们常说标准输入就是文件描述符0,输出是1,错误是2,为了增强可移植性,linux的unistd.h中对这三个描述符进行了宏定义,所以有STDIN_FILENO - 0, STDOUT_FILENO - 1, STDERR_FILENO - 2。
stdio.h中有指针定义:
141 /* Standard streams. */
142 extern struct _IO_FILE *stdin; /* Standard input stream. */
143 extern struct _IO_FILE *stdout; /* Standard output stream. */
144 extern struct _IO_FILE *stderr; /* Standard error output stream. */
145 #ifdef __STDC__
146 /* C89/C99 say they're macros. Make them happy. */
147 #define stdin stdin
148 #define stdout stdout
149 #define stderr stderr
150 #endif
unistd.h中有如下宏定义:
180 /* Standard file descriptors. */
181 #define STDIN_FILENO 0 /* Standard input. */
182 #define STDOUT_FILENO 1 /* Standard output. */
183 #define STDERR_FILENO 2 /* Standard error output. */
重定向最常用的两个:“>”,“<”,分别为输出重定向和输入重定向。
进阶一步:追加的输出重定向:“>>”。
思考上述重定向工作:输出重定向就是以只写方式打开文件,将标准输出stdout(文件描述符1)写入该文件,注意,标准错误信息stderror(2)不会写入该文件。
输入重定向则是只读方式打开并读取文件到标准输入stdin(0)