Linux系统中 printf(函数的执行过程 用户空间、运行在用户态 内核空间、运行在内核态 0垂垂 ·····························,······,,····中··········,·,· main( printf write system_callo sys_write printf;xXXO int $Ox80 用户程序O标准系統调用氵系统调用 系统调用 库函数 封装函数 处理程序 服务例程 ··。非非 。。。. °某函数调用了 printf(0,执行到调用 printf语句时,便会转到C语言 I/O标准库函数 printf去执行; ° printf(0通过一系列函数调用,最终会调用函数 write0 调用 write(时,便会通过一系列步骤在内核空间中找到 write对应的系 统调用服务例程 sys_write来执行 在 system_cal中如何知道要转到 sys_write执行呢?根据系统调用号!
Linux系统中printf()函数的执行过程 ° 某函数调用了printf(),执行到调用printf()语句时,便会转到C语言 I/O标准库函数printf()去执行; ° printf()通过一系列函数调用,最终会调用函数write(); ° 调用write()时,便会通过一系列步骤在内核空间中找到write对应的系 统调用服务例程sys_write来执行。 main() { … printf(); … } 用户程序 printf() { … xxxx(); … } system_call() { … xxxx(); … } 系统调用 封装函数 系统调用 处理程序 用户空间、运行在用户态 内核空间、运行在内核态 write() { … int $0x80 … } I/O标 准 库函数 sys_write() { … … … } 系统调用 服务例程 在system_call中如何知道要转到sys_write执行呢? 根据系统调用号!
应 read 应用层的Read函数在 Linux内核中的单向 20次以上的调用!! r8o中断触发与处理 文件系层 sys read generic file read find pag nolock page cache read generic file readahead d to page cache Ext2 readpage mpage readpage mpage bio submit Submit bi 通用块设备层 blk partition remap generic make reque续 1调度层 make requeve fn bik requeue make request make requeue 物理设备动 … response proces … Devcie access
应用层的Read函数在Linux内核中的单向 20次以上的调用!!
用户空间中的O函数 °用户程序可通过调用特定的o函数的方式提出I/O请求 °在 UNIX/ Linux系统中,可以是C标准O库函数或系统调用的封装函数 ,前者如文件O函数 fopen0、 fread0、 fwrite0和 Fclose或控制台 /O函数pnt0、putc0、scap和getc等;后者如pen0、read0 write0和 closed等。 °标准I/库函数比系统调用封装函数抽象层次高,后者属于系统级0函 数。与系统提供的AP函数一样,前者是基于后省实现的。 fopen fopen fread fwrite fscanf fprintf sscanf sprintf application program gets f fe puts fflush fseek fclose Standard 1/o functions open read Unix I/o functions write lseek 4 stat close (accessed via system calls
用户空间中的I/O函数 ° 用户程序可通过调用特定的I/O函数的方式提出I/O请求。 ° 在UNIX/Linux系统中,可以是C标准I/O库函数或系统调用的封装函数 ,前者如文件I/O函数fopen()、fread()、fwrite()和fclose()或控制台 I/O函数printf()、putc()、scanf()和getc()等;后者如open()、read() 、write()和close()等。 ° 标准I/O库函数比系统调用封装函数抽象层次高,后者属于系统级I/O函 数。与系统提供的API函数一样,前者是基于后者实现的
用户空间中的O函数 C标准库 UNIX/Linux Windows 功能描述 getc, scanf, gets read Read console 从标准输入读取信息 tread re d Read File 从文件读入信息 putc,print,puts wnte WriteConsole 在标准输出上写信息 fwrite wrte WriteFile 在文件上写入信息 fopen open, creat CreateFile 打开创建一个文件 fclose close Closehandle 关闭文件( Closehandle不限于文件) fseek Iseek Set Filepointer 设置文件读写位置 rewind d lseek(0) eFd将文件指针计设置成指向文件开头 remove unlink DeleteFile 删除文件 feof 无对应 无对应 停留到文件未尾 perror strerror FormatMessage输出错误信息 无对应 stat, fstat, lstat Get FileTime 获取文件的时间属性 无对应 stat, fstat, Istat GetFileSize 获取文件的长度属性 无对应 font LockFile// UnlockFile文件的加锁、解锁
用户空间中的I/O函数
文件的基本概念 °所有o操作通过读写文件实现,所有外设,包括网络、终端设备,都被看成 文件。 print在哪显示信息? stdout文件!即终端显示器TT °所有物理设备抽象成逻辑上统一的“文件”使得用户程序访问物理设备与访 问真正的磁盘文件完全—致。例如, fprintf/fwrite(主要是磁盘文件)和 printf( stdout)都通过统一的 write函数陷入内核,差别则由内核处理! UNⅨX系统中,文件就是一个字节序列。 Stream!字节流 °通常,将键盘和显示器构成的设备称为终端( terminal),对应标准输入 和标准(错误)输出文件;像磁盘、光盘等外存上的文件则是普通文件。 °根据文件的可读性,文件被分成ASCm文件和二进制文件两类 °ASCm文件也称文本文件,可由多个正文行组成,每行以换行符^n′结束 ,每个字符占一个字节。标准输入和标准(错误)输出文件是ASCI文件 °普通文件可能是文本文件或二进制文件
文件的基本概念 ° 所有I/O操作通过读写文件实现,所有外设,包括网络、终端设备,都被看成 文件。 ° 所有物理设备抽象成逻辑上统一的“文件”使得用户程序访问物理设备与访 问真正的磁盘文件完全一致。例如,fprintf/fwrite(主要是磁盘文件) 和 printf (stdout) 都通过统一的write函数陷入内核,差别则由内核处理! ° UNIX系统中,文件就是一个字节序列。 ° 通常,将键盘和显示器构成的设备称为终端(terminal),对应标准输入、 和标准(错误)输出文件;像磁盘、光盘等外存上的文件则是普通文件 。 ° 根据文件的可读性,文件被分成ASCII文件和二进制文件两类。 ° ASCII文件也称文本文件,可由多个正文行组成,每行以换行符‘\n’ 结束 ,每个字符占一个字节。标准输入和标准(错误)输出文件是ASCII文件。 ° 普通文件可能是文本文件或二进制文件。 printf在哪显示信息? stdout文件! 即终端显示器TTY Stream!字节流