Ключевые слова:informix, zombie, wrapper, example, database, (найти похожие документы)
_ RU.LINUX (2:5077/15.22) ___________________________________________ RU.LINUX _
From : nil 2:5015/46 23 Sep 98 00:02:26
Subj : Informix and zombies
________________________________________________________________________________
Hello !
По поводу Informix SE 7.22 for Linux :
Остаются зомби.
В comp.database.informix решили, что достаточно использовать следующий
код. Запрускать нужно "nozombie $INFORMIXDIR/lib/sqlexecd [servicename]".
/* nozombie.c */
#include <signal.h>
#include <unistd.h>
#include <stdio.h>
int main(int argc, char **argv)
{
signal(SIGCHLD, SIG_IGN);
execv(argv[1], &argv[1]);
fprintf(stderr, "Failed to execv() %s\n", 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)