操作系统设计与实现-第一章:序言
1.4 系统调用
从某种意义上说,发出一个系统调用类似于发出一个特殊的函数调用,两则的区别仅在于,发出系统调用之后,将进入内核或其他的特权操作系组件,而系统调用则不会这样。如一个进程正在用户态下运行一个程序,然后它需要一个系统服务,如读取文件数据,那么它就必须执行一个 陷阱
或者系统调用
,把控制权交个操作系统。操作系统通过检查此次系统调用的参数,判断出该进程所需要的服务类型,然后其执行相应的服务功能,并把控制权交给用户进程,从系统调用后面的那条指令开始。
MINIX 3 共有53条系统调用,被分为6大类。
1.4.1 进程管理的系统调用
pid = fork() 创建一个与父进程相同的子进程
如果返回0,表明当前进程是子进程。返回一个整数则是父进程,该整数即为子进程的标识号PID。
我的理解是父进程在fork()后,系统创建一个父进副本并运行,因为是完全拷贝,包括进程状态,变量,以及运行到了哪个位置都完全一致,父进程在执行fork()函数到达函数末尾时应该就把子进程创建出来了,所以子进程刚好从fork()函数结尾处开始运行,准备返回,又因为系统标记为子进程,所以在子进程中,从fork()返回的是0。子进程本身并没有执行fork()的全部,它只是从结尾处开始运行,最后返回了一个0。而在父进程则走完了fork()完全流程,返回一个整数。