文件描述符 exes

一.系统调用和库函数的区别

文件描述符 exes 文件描述符 exes

    系统调用号                                       系统调用表

    用户空间                                            内核空间

 执行系统调用会产生一个终端,内核此时 帮我们执行一部分代码,打开一个文件,只有内核知道它在哪存放,打开并读取数据

现场保护:执行open以后,系统调用执行,我们要从用户空间转到内核空间,首先产生中断,中断一旦产生main程序不在往下执行,

                 cpu中有很多寄存器,寄存器在运行时记住了刚才运行的空间值,并保存下来,等到要用的时候再恢复到寄存器

现场恢复:

eax:扩展

文件描述符 exes0 标准输入  1标准输出  2 标准错误输出

 

 

在内核中把提供的让用户使用的接口称为系统调用。

系统调用会产生终端,进入内核,内核读取数据提交给用户执行

库函数调用完成后,直接返给用户(用户不需要系统调用,不需要内核代码)

区别: 系统调用的实现在内核中,属于内核空间,库函数的实现在函数库中,属于用 户空间 系统调用执行过程如下图: 文件描述符 exes

 

 二.fork ,open

1.先open后fork

文件描述符 exes

 2.先fork后open

文件描述符 exes

代码如下:

文件描述符 exes

结果如下:

文件描述符 exes

文件描述符的值永远取的是下标最小未被使用的一项

最终结论:

父进程打开的文件,fork后,子进程也可以访问,只是共享偏移量

 例:

1)

文件描述符 exes

printf执行时,把A放在缓冲区

文件描述符 exes

 

2)

 文件描述符 exes

fork()||fork(),无论第一个fork为什么先执行一次,当fork大于0时执行第一个fork;等于0时执行第二个,然后复制一个进程

文件描述符 exes

 

 文件描述符 exes

 

 总结:每个进程都有一个PCB,这个PCB就是一个结构体,在PCB中有一个文件表,文件表中表示打开的文件,

           默认系统前三个位标准输入0  stdin,标准输出1 stdout,标准错误输出2  stderror;

 

上一篇:php里进程创建和分析


下一篇:Git使fork项目与源项目保持一致