進(jìn)程(process)通??杀粴w為父進(jìn)程和子進(jìn)程。
父進(jìn)程負(fù)責(zé)創(chuàng)建和結(jié)束子進(jìn)程。子進(jìn)程調(diào)用exit()并不能立即結(jié)束,會(huì)發(fā)SIGCHLD信號給父進(jìn)程,以便父進(jìn)程對資源進(jìn)行回收。
在子進(jìn)程結(jié)束前,如果父進(jìn)程已經(jīng)結(jié)束,那也沒有問題。你的子進(jìn)程就變成了孤兒進(jìn)程或者守護(hù)進(jìn)程。系統(tǒng)init進(jìn)程會(huì)充當(dāng)父進(jìn)程的角色對子進(jìn)程進(jìn)行管理和回收。
父進(jìn)程可以采用wait或waitpid等待已結(jié)束的子進(jìn)程退出。如果父進(jìn)程沒有調(diào)用wait或waitpid來等待子進(jìn)程退出。而且父進(jìn)程一直運(yùn)行,就會(huì)產(chǎn)生僵尸進(jìn)程。這就是一個(gè)應(yīng)該被避免的問題。
通常父進(jìn)程可以采用signal的方式來等待和回收子進(jìn)程結(jié)束。示例如下:
void
sig_chld(int signo)
{
pid_t pid;
int stat;
while ( (pid = waitpid(-1, &stat, WNOHANG)) > 0)
printf("child %d terminated\n", pid);
return;
}
int main()
{
Signal(SIGCHLD,sig_chld);
....
if((child = fork()) == 0)
{
}
else
{
}
....
}