Итак, вы хотите, чтобы в любой момент времени был запущен ровно один дочерний процесс, тогда зачем порождать все дочерние процессы одновременно?
Когда дочерний процесс завершается, выдается SIGCHLD
, вы можете написать свой собственный обработчик для этого сигнала и вызвать spawn из обработчика.Тогда у вас есть один новый дочерний процесс, созданный, когда один из них погибает - только один дочерний процесс запущен.Ниже приведен хак (бесполезный, только для демонстрации), чтобы добиться этого:
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <signal.h>
#include <stdlib.h>
void spawn(void){
pid_t child_pid=fork();
if(child_pid > 0){
printf("new child created by %d !\n",getpid());
sleep(1);
}else if(child_pid == 0){
printf("child %d created !\n",getpid());
}else{
exit(EXIT_FAILURE);
}
}
void handler(int sigval){
spawn();
}
int main(void){
signal(SIGCHLD,handler);
spawn();
return 0;
}