内核打开或者创建一个新文件时,都会返回一个文件描述符,用以标识一个特定进程正在访问的文件,通常是一个非负整数。在读写文件时,可以使用这个文件描述符。
2. 标准输入、标准输出和标准错误每当运行一个程序,shell都为其打开3个文件描述符,即:标准输入、标准输出和标准错误。默认情况下,这三个描述符链接向终端,shell提供了一种方法,使得其中任一个描述符可以重定向到某个文件。
3. 不带缓冲的IO读写文件函数:open、read、write、lseek、和close提供了不带缓冲的IO,这些函数都使用文件描述符。
- 实例
#incude "apue.h"
#define BUFSIZE 4096
int main(void)
{
int n;
char buf[BUFSIZE];
while (n = read(STDIN_FILENO, buf, BUFSIZE) > 0)
{
if(write(STDOUT_FILENO, buf, n) != n)
err_sys("write error");
}
if(n < 0)
{
err_sys("read error");
}
exit(0);
}
头文件 包含了头文件
read函数返回读取的字节数,用于要写的字节数。当到达文件末尾时,read返回0,程序停止执行。如果发生了读错误,read返回-1.
将该程序编译成a.out文件,以下方式执行:
- . /a.out > data
那么标准输入是终端 (默认情况,文件描述符链接向终端) ,标准输出重定向至文件data,标准错误也是终端。如果此文件不存在,则shell会创建它,改程序将键盘输入各行复制到标准输出,键入文件结束符(Ctrl+D)时,将终止本次复制。 - . /a.out
outfile
会将文件名为infile的文件的内容复制到outfile文件.
标准IO是为不带缓冲的IO函数提供了带缓冲的接口,让我们无需考虑缓冲区的大小。例如常用的printf函数.
实例
#include "apue.h"
int main(void)
{
int c;
while(c=getc(stdin) != EOF)
if(putc(c, stdout) == EOF)
err_sys("out put error");
if(ferror(stdin))
err_sys("input error");
exit(0);
}
5. 出错处理
系统出错时,通常会返回负值,整形变量errno通常被设置为具有特定信息的值.
文件
C标准定义了两个函数,用于打印出错信息:
- char *strerror(int errnum) //将errnum(通常就是errno)映射为一个出错字符串,返回指针
- void perror(const char *msg); 基于errno的当前值,将标准错误上产生一条错误信息,然后返回。
系统调用是程序向内核请求服务的入口点,应用代码可以直接使用系统调用.
库函数可以使用系统调用,也可能不使用,但不能直接接触内核.
系统调用由系统提供,不可更改,但库函数我们可以更改,可以把库函数理解为写的通用的应用代码.



