c库函数





c库函数
使用fopen打开 hello.txt,返回值是文件结构体指针file *fp,这个结构体里面东西很多,但重要介绍三种
1.文件描述符:
对于内核而言,所有打开的文件都通过文件描述符引用。文件描述符是一个非负整数。当打开或者创建一个现有文件或创建一个新文件时,内核会向进程返回一个文件描述符。
内核中的PCB进程块,有一个文件描述符表,0(STDIN_FILENO),1(STDOUT_FILENO),2(STDERR_FILENO),分别代表标准输入,标准输出,标准错误,默认是打开状态。每次打开一个文件,则占用一个文件描述符,而且使用的是最小的文件描述符。
标准输入文件(stdin),通常对应终端的键盘;标准输出文件(stdout)和标准错误输出文件(stderr),这两个文件都对应终端的屏幕。( ulimit -a 此命令可以看到一个进程中能打开的最大文件数。)

2.文件读写 指针位置:记录文件读写过程中指针的实际位置。

3.I/O缓冲区(内存地址),通过寻址找到对应的内存块,默认buffer 8192byte,数据是从内存刷新到磁盘。
同时也有三种方式可以控制数据从内存刷新到磁盘,第一是刷新缓冲区,fflush,第二是缓冲区已满,第三是,调用fclose,return(main函数), exit(main函数)。

C库函数和系统函数之间的关系
    问题:C库函数printf("hello")是如何输出到屏幕上的?
    printf函数 ---> 标准输出函数(stdout): file*,文件指针主要有3个东西,FD文件描述符,FP_POS(文件读写指针),BUFFER(I/O缓冲区)。
    向下调用write函数,linux系统API,系统调用sys_write(),调用设备驱动,内核层设备驱动函数,通过设备驱动调用显示器。
虚拟地址空间: linux会为每一个运行的程序(进程32位)操作系统都会为其分配一个0-4G的地址空间(虚拟地址空间)。

4G
        内核空间是受保护的,用户不能对空间进行读写操作,否则会出现段错误。
       内存管理
       进程管理
       设备驱动管理
       VFS虚拟文件系统
3G
     环境变量(env)
      命令行参数(int main(int argc, char* argv[]))
      栈空间(小,从下往上,局部变量)  
     共享库(包含C标准库,linux系统IO函数。相对地址。
     堆空间(从下往上)
     .bss(用来存放程序中未初始化的全局变量和静态变量,在程序执行之前BSS段会自动清0。经测试,int a = 0;类似这样的全局变量也是存在.BSS段的。)
     .data段(已初始化全局变量和静态变量)
    .text(代码段,二进制机器指令)  (ELF包括.text段,.data段,.bss段,linux下可执行文件格式为:ELF)
         file命令       
0   受保护的地址(0-4K) #define NULL (void*) 0

为什么使用虚拟地址空间和物理地址空间进行映射?
1.方便编译器和操作系统安排程序的内存分布。程序可以使用一系列相邻的虚拟地址空间来访问物理内存中不相邻的大内存缓冲区。
2.方便进程之间隔离。不同的进程间使用的虚拟地址空间彼此隔离,一个进程中的代码无法更改另外一个进程中的物理内存。
3.程序可以使用一系列的虚拟地址来访问大于可用物理内存的内存缓冲区,当物理内存供应量变小时,内存管理器会将物理内存页(大小为4KB)保存到磁盘文件。数据和代码页会根据需要在物理内存与磁盘之间移动。



































评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值