2. 输入和输出
1.文件描述符,文件描述符通常是一个小的非负整数,内核用来标识一个文件。
2.每当运行一个程序,shell会打开三个文件描述符:标准输入(描述符0),标准输出(描述符1),标准错误(描述符2)。一般情况下这三个文件描述符都链接指向终端,用户也可以重定向到某个文件。
open函数在打开文件时,返回的文件描述符总是从最小值0逐渐递增,比如运行一个程序,最先打开标准输入,所以标准输入的文件描述符为0,其次是标准输出,标准错误,分别是1和2、
在POSIX中,文件描述符已经被标准化,定义为STDIN_FILENO、STDOUT_FILENO、STDERR_FILENO,它们的值分别是0、1、2。这三个宏定义在<unistd.h>中。
若此时关闭标准输出:
close(STDOUT_FILENO);
然后打开一个本地文件:
int fd = open("test.txt", O_RDWR);
则fd的值一定是1(优先使用可用的最小的文件描述符),这就造成随后的标准输出重定向到了文件test.txt中,比如:
std::cout << "hello world" << std::endl;
此时就将hello world写入到了文件test.txt中,而不是输出到控制台。
3.头文件<unistd.h>提供了open,read,write,lseek,close这些不带缓冲的io,这些函数都使用文件描述符,例如:
#define BUFLEN 1024
char buf[BUFLEN];
int n = read(STDIN_FILENO, buf, BUFLEN);