23,125
社区成员
发帖
与我相关
我的任务
分享
#define _XOPEN_SOURCE
#define _XOPEN_SOURCE_EXTENDED
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>
static int giConn = 0;
/*
WNOHANG return immediately if no child has exited.
WUNTRACED also return if a child has stopped (but not traced via ptrace(2))
*/
void wake_up(int sig)
{
pid_t pid = 0;
int status = 0;
while((pid = waitpid(-1, &status, WNOHANG|WUNTRACED)) > 0) {
giConn--;
printf("==child %d die because %s, remain %d\n", pid, status?"error":"end", giConn);
}
}
int create_child(void)
{
pid_t pid;
pid = fork();
if (pid < 0) {
perror("fork failed");
}
else if (0 == pid) {//child
sleep(1);//do something
exit(0);
}
else {//parent
giConn++;
printf("==child %d create, total is %d\n", pid, giConn);
}
}
int main(void)
{
int i = 0;
sighold(SIGCLD); //receive SIGCLD signal
sigset(SIGCLD, wake_up);
for (i = 0; i < 10; i++) {
create_child();
}
printf("++++++++parent wait...\n");
while (getchar() != '\n');//press Enter to Exit the process
printf("++++++++parent end...\n");
exit(0);
}