Linux内核的进程调度函数
Last updated
Was this helpful?
Last updated
Was this helpful?
Fork及其变种在类Unix系统中通常是创建新进程的唯一方式。 如果进程需要启动另一个程序的可执行文件,它需要先Fork来创建一个自身的副本。在fork之后,两个进程还运行着相同的程序,都像是调用了该系统调用一般恢复执行。然后它们可以检查调用的返回值确定其状态:是父进程还是子进程,以及据此行事。
fork的函数原型如下:
返回值:成功调用fork时,父进程中的
fork
返回子进程的pid
,子进程中则返回0
,如果创建子进程失败返回-1
。
wait调用的一个意义在于获取子进程状态变更的相关信息,对于已经terminated
的进程,调用wait
可以使系统能够释放和进程相关的资源,否则进程会一直处于zombie
状态。
wait()
wait()
的原型如下:
返回值:调用成功返回进程ID,失败返回
-1
。
在调用wait
时,会暂停目前进程的执行,并开始分析当前进程中是否有子进程已经退出(进入僵死状态),如果有则会收集子进程的信息并将其销毁后返回,否则一直等待。
status
参数是为了保存退出进程的状态,是指向int
类型的指针。如果并不需要这一状态,可以传递NULL作为参数。
tait(&state);
调用等效于waitpid(-1, &status, 0);
。
waitpid()
waitpid
在原本的wait
基础上新增了两个参数,其原型如下:
参数
参数
使用
pid
等待的子进程的id。
pid < -1
时等待绝对值相等的进程组中的所有进程。
pid = -1
等待任何子进程,相当于wait()
,事实上wait
就是这么实现的。
pid = 0
时,等待同一进程组中的所有子进程(进程组ID相同)。
pid > 0
等待任何子进程id为pid
的进程。
option
以一些额外的选项来控制waitpid
,不使用则设为0
。
WNOHANG
如果没有任何已经结束的进程,则马上返回。
WUNTRACED
如果子进程进入暂停执行的状态,则马上返回。
status
接收状态信息,储存在一个int
类型的值中,不需要则设为NULL
。
返回值
状态
返回值
正常返回
waitpid()
收集到的子进程的pid
。
设为WNOHANG
并发现没有已退出的子进程
返回0
。
调用出错
返回负值。
wait3()
和wait4()
函数原型如下:
wait3()
和wait4()
除了可以活得子进程的状态信息外,还可以获得子进程的资源使用信息,通过参数rusage
得到。其中wait3
等待所有进程,wait4
等待指定pid
的进程。
据Linux man page,两个函数非标准因而不推荐使用。
C语言的信号量实现包含在semaphore.h
中。
信号量使用类型为sem_t
的变量,在使用之前需要对信号量进行初始化,并设置初始值。
初始化:使用sem_init();
进行初始化,函数的定义如下:
参数:
sem
:指定要初始化的信号量。pshared
:0
表示应用于多线程,非0
标识用于多线程。value
:指定信号量的初始值。
wait等待:使用sem_wait()
时,信号量减一,当信号量为0是,函数阻塞。
参数即传入一个信号量
sem
。
trywait等待:使用sem_trywait()
相比于sem_wait()
在信号量为0的时候不会阻塞。
如果无法完成自减操作,返回错误(被设置为
EAGAIN
)。
post增加:使用sem_post()
时,信号量数值增加。