kill(pid, 0)的返回值0表示进程存在,<0表示进程已经结束。
fork之后的子进程,在运行结束时被设置为僵死进程,并且会给父进程发送信号SIGCHLD,只要在进程中收到此信号后waitpid下就可以完全终止子进程。
#include <stdio.h>
#include <sys/types.h>
#include <signal.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
void handle(int sig)
{
if (sig == SIGCHLD)
{
int pid;
int status;
printf("recv SIGCHLD\n");
while((pid = waitpid(-1, &status, WNOHANG)) > 0)
{
}
}
}
int main()
{
pid_t pid;
pid = fork();
if (pid<0)
;
else if (pid == 0)
{
sleep(5);
printf("child exit\n");
return 1;
}
else
{
signal(SIGCHLD, handle);
int ret;
while(1)
{
sleep(1);
ret = kill(pid, 0);
printf("ret = %d\n", ret);
if (ret < 0)
{
printf("child had dead\n");
}
else
{
printf("child is alive\n");
}
}
}
}