sys__open的实现流程以及创建进程后父子进程的关系

在用户态下库函数的实现过程:
1、系统调用号通过eax寄存器被保存起来。
2、保存现场。
3、触发0x80中断。(0x80中断对应系统调用函数)
之后,便进入内核手段,这里说一下open在内核态下的实现流程。
1、在进程PCB中申请一个未使用元素的下标,fd。
2、申请struct file结构体变量,在全局数组中存储,其中个包含:
f_mode(对文件的读写模式,如果驱动程序需要这个值,可以直接读取)
f_flag(打开文件时指定的标志,驱动程序为了支持非阻塞操作需要检查这个值)
f_inode(具体文件)
f_count(标记该文件当前的被使用量)
f_pos(文件的读写位置)
3、打开文件。
4、判断文件是否打开,设置文件读写偏移量,将inode中的值赋值给f_inode。

进程的创建:pid_t fork(void)
在程序中创建进程后,创建的新进程会复制调用fork函数的进程指令和数据,也就是父进程产生子进程。
fork函数调用一次,会返回两个值,在父进程中返回子进程的pid,在子进程中返回0。父进程产生子进程后,两者相互独立,各自运行,两者运行的快慢由系统的当前环境和调度算法决定。
写时拷贝:fork运行之后,父子进程共享所有空间,内核将空间置为只读模式,当任意一个进程试图修改数据,内核会将修改数据所在页直接拷贝出来。
父子进程共享在fork之前打开的文件描述符,但是不共享文件的读写偏移量,当close关闭文件时,系统先搜索出struct file中的f_count成员,如果count为0,则文件真正关闭,直接退出;不为0,则count–。

猜你喜欢

转载自blog.csdn.net/shanggamo/article/details/81567608