Вы можете перезапустить свой сервер изнутри себя , используя fork. О, красота Unix.
Что-то вроде:
int result = fork();
if(result == 0)
DoServer();
if(result < 0)
{
perror(); exit(1);
}
for(;;)
{
int status = 0;
waitpid(-1, &status, 0);
if(!WIFEXITED(status))
{
result = fork();
if(result == 0)
DoServer();
if(result < 0)
{
puts("uh... crashed and cannot restart");
exit(1);
}
}
else exit(0);
}
EDIT:
Вероятно, разумно использовать макрос WIFEXITED
в качестве условия проверки, который является более кратким и переносимым (соответственно изменил код). Кроме того, он адекватно моделирует семантику, которую мы, вероятно, хотим.
waitpid
, учитывая нулевые флаги, не вернет ничего, кроме нормального или ненормального завершения. WIFEXITED
приводит к true
, если процесс завершился нормально, например, путем возврата из main
или вызова exit
. Если процесс завершился нормально (например, потому что вы запросили это), очень вероятно, что не захочет продолжать его перезапуск до конца дней!