При реализации видеостримера (туда еще нужно будет обработку добавить, но пока основная функция — собирать кадры видео и выплевывать в браузер) на некоторых USB-камерах ffmpeg при длительной работе выпадает в assert (вообще, дикость!). Аналогичные проблемы бывают при использовании libwebsockets, которая в случае отключения клиента тоже выбрасывает assert.
Чтобы бороться с этим я решил делать форк в самом начале, а потом контролировать работу дочернего процесса и если помрет — перезапускать заново.
Вот что получилось:
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <stdlib.h>
int child_killed = 0;
void sighndlr(int sig){
printf("got signal %d\n", sig);
if(sig == SIGCHLD){
printf("Child was killed\n");
child_killed = 1;
}else{
printf("suicide\n");
exit(sig);
}
}
pid_t create_child(){
child_killed = 0;
int i;
pid_t p = fork();
if(p == 0){
printf("child\n");
char *ptr = malloc(10000);
for(i = 0; i < 256; ++i, ptr += 1024){
*ptr += i;
}
}
return p;
}
int main(){
int i;
for(i = 0; i < 255; ++i)
signal(i, sighndlr);
for(i = 0; i < 10; ++i){
pid_t p = create_child();
if(p){
printf("child #%d with PID %d\n", i, p);
while(!child_killed)
usleep(10000);
}else return 0;
}
return 0;
}
create_child()
в дочернем процессе будет запускать "падучие функции", а родительский только будет "пасти" дочерние.Вопрос: есть ли какие-то недостатки у такой реализации?