一.系统调用和库函数的区别
系统调用号 系统调用表
用户空间 内核空间
执行系统调用会产生一个终端,内核此时 帮我们执行一部分代码,打开一个文件,只有内核知道它在哪存放,打开并读取数据
现场保护:执行open以后,系统调用执行,我们要从用户空间转到内核空间,首先产生中断,中断一旦产生main程序不在往下执行,
cpu中有很多寄存器,寄存器在运行时记住了刚才运行的空间值,并保存下来,等到要用的时候再恢复到寄存器
现场恢复:
eax:扩展
0 标准输入 1标准输出 2 标准错误输出
在内核中把提供的让用户使用的接口称为系统调用。
系统调用会产生终端,进入内核,内核读取数据提交给用户执行
库函数调用完成后,直接返给用户(用户不需要系统调用,不需要内核代码)
区别: 系统调用的实现在内核中,属于内核空间,库函数的实现在函数库中,属于用 户空间 系统调用执行过程如下图:
二.fork ,open
1.先open后fork
2.先fork后open
代码如下:
结果如下:
文件描述符的值永远取的是下标最小未被使用的一项
最终结论:
父进程打开的文件,fork后,子进程也可以访问,只是共享偏移量
例:
1)
printf执行时,把A放在缓冲区
2)
fork()||fork(),无论第一个fork为什么先执行一次,当fork大于0时执行第一个fork;等于0时执行第二个,然后复制一个进程
总结:每个进程都有一个PCB,这个PCB就是一个结构体,在PCB中有一个文件表,文件表中表示打开的文件,
默认系统前三个位标准输入0 stdin,标准输出1 stdout,标准错误输出2 stderror;