По поводу Informix SE 7.22 for Linux :
Остаются зомби.
В comp.database.informix решили, что достаточно использовать следующий
код. Запрускать нужно "nozombie $INFORMIXDIR/lib/sqlexecd [servicename]".
int main(int argc, char **argv)
{
signal(SIGCHLD, SIG_IGN);
execv(argv[1], &argv[1]);
fprintf(stderr, "Failed to execv() %sn", argv[1]);
return 1;
}
Что же реально за проблемма такая в Informix SE ?
TCP/IP соединение принимает sqlexecd, который авторизирует пользователя и
если успешно, то делает pipe, fork, setuid(user) и соединяет сокеты к
пайпам sqlexec (который, видимо, делает getuid, а потом getpwuid тем самым
он понимает что за юзер залогинен). Сразу видно что Informix больше дружит
с юниксом нежели его собрат Interbase :)
Для отслеживания процесса-ребенка была использована функция
signal(SIGCHLD, ...), когда погибает ребенок (sqlexec) ядро посылает
процессу sqlexecd сигнал SIGCHLD и тот его обрабатывает. К сожалению, они
забыли, что после обработки сигнала нужно опять его выставить, а тут
получилось что он в default ставиться. Вот почему первый раз, когда вы
коннектитесь к informix у вас _не_образуется_ зомби (сигнал корректно
обрабатывается), на второй уже появляется зомби. Если сделать kill
sqlexecd, то естественно, что все зомби пропадают, но это imho не выход из
положения. :(
Вышеописанный сюшный сорц не помогает в данном случае, т.к. Linux не
слышал про работу с SIGCHLD как это реализовано в SVR4.
Best regards, Nil.
E-mail: nil@inforis.ru, FIDO: 2:5015/46
--- ifmail v.2.14.os
* Origin: Savage Station (2:5015/46@fidonet)
496 Прочтений • [Informix and zombies (informix zombie wrapper example database)] [08.05.2012] [Комментариев: 0]