仅用waitpid能否终止进程?需配合kill才能终止回收子进程吗?
关于waitpid与进程终止/回收的问题解答
嘿,咱们把这两个问题拆解开来,一步步说清楚:
1. 仅调用waitpid函数是否足以终止一个进程?
答案是绝对不行。waitpid()的核心作用是回收已经终止的子进程的资源(比如释放它占用的内存、清理系统进程表项),它本身没有任何能力主动终止一个正在运行的进程。简单说:它是“收尸”的,不是“杀人”的——子进程得先自己正常退出、主动调用exit,或者被其他信号触发终止,它才能发挥回收资源的作用。
2. 代码waitpid(pid,&cs,0);能否在不执行kill操作的情况下终止并回收子进程?
这得分两种场景来看:
- 如果子进程会自行终止:比如子进程是执行完任务就调用
exit()、return,或者因为运行错误(比如段错误)崩溃退出,那父进程直接调用waitpid(pid,&cs,0);完全可以完成回收,不需要提前执行kill操作。这时候waitpid会阻塞到子进程终止,然后自动完成资源清理。 - 如果子进程是持续运行的(比如死循环):这种情况下,子进程自己不会主动退出,
waitpid(pid,&cs,0);会一直阻塞下去,子进程还会继续占用系统资源跑着。这时候就必须先通过kill(pid,SIGTERM);(或者其他强制终止信号,比如SIGKILL)主动发送信号让子进程终止,之后再调用waitpid来回收它的资源。
举两个直观的例子:
如果子进程代码是这样的(会自行退出):
int main() { printf("子进程任务完成,准备退出\n"); return 0; }
父进程直接waitpid(pid,&cs,0);就足够完成回收。
但如果子进程是无限循环(不会自行终止):
int main() { while(1) { /* 一直循环跑着 */ } }
那父进程必须先执行kill(pid,SIGTERM);,再调用waitpid,否则waitpid会一直卡着,子进程也不会停止。
内容的提问来源于stack exchange,提问作者Yazgan
相关产品推荐
相关产品推荐

