fork进程执行顺序疑惑及子进程执行完成信号机制问询
关于父进程先执行else块与retval的疑问解答
为什么父进程的else代码块先执行?
调用fork()创建子进程后,父、子进程的执行顺序完全由操作系统内核的进程调度算法决定,没有固定的先后规则。你观察到父进程else块先执行,只是本次调度中内核优先给了父进程运行时间片——可能是父进程原本就在运行队列前端,或是临时优先级更高,内核便让它继续执行了。
retval如何反映子进程执行完成?
你说的retval应该是wait()或waitpid()的返回参数,它和二元信号量完全不是一回事,本质是父进程通过系统调用主动等待子进程的状态变化:
- 子进程运行结束时,内核会将其标记为僵尸进程,同时保存它的退出状态(比如退出码、是否被信号终止等信息)。
- 父进程调用
wait(&retval)时,会被内核挂起,直到有子进程结束;一旦子进程终止,内核会把退出状态写入retval指向的内存地址,再唤醒父进程。 - 你可以通过
WIFEXITED(retval)、WEXITSTATUS(retval)这类宏解析retval,判断子进程是正常退出还是被信号杀死,以及具体的退出码。
子进程的操作逻辑很直接:它从fork()返回的位置开始执行自己的代码路径,完成任务后调用exit()或从main函数返回,此时内核就会向等待中的父进程传递结束信号。
内容的提问来源于stack exchange,提问作者Venkat Balachandra
相关产品推荐
相关产品推荐

