PS-ка их отображает как ./main
>PS-ка их отображает как ./mainВ самой программе встрой счетчик запуска вызова fork() и выведи результат.
Да, но этот счетчик будет только наращиваться, а мне его еще и как-то уменьшать надо. Можно наворотить разделяемую память, но может есть более простой способ?
А что, ты ожидать завершения потомков не будешь ? Будешь плодить зомбей ? :)
Вешаешься на сигнал SIGCHLD и в нем уменьшаешь счетчик. Где будет храниться счетчик - локально или в разделяемой памяти - уже не важно.
Izvinite ja translit.Potomkov kontrolirovatj ne nado.
sigset(SIGCLD,SIG_IGN) - i zombijev ne budet
sozdajosh semafor s kljuchom IPC_PRIVATE.
Sledujushcije potomki budut vidjet ID.
Potom kazdij potomok posle forka, podnimajet znachenije
semafora na +1 s flagom SEM_UNDO.
Kogda on umret jevo operacija na semafore anulirujetsa.
Shtobi glavnij process uznal skolko u nevo zhivih potomkov,
dostatochno posmotretj znachenije semafora.Minus -
Potomok dolzen sdelatj operaciju semafora.
Plusi -
Potomku pri okonchanije ne nado zabotitsa o izmenenie znachenija semafora(jesli jevo ktoto ubjot, semafor otkatitsa avtomaticheski).>А что, ты ожидать завершения потомков не будешь ? Будешь плодить зомбей
>? :)
>Вешаешься на сигнал SIGCHLD и в нем уменьшаешь счетчик. Где будет храниться
>счетчик - локально или в разделяемой памяти - уже не важно.
>
По поводу "sigset(SIGCLD,SIG_IGN);" Незнаю где как, а в linux:---cut here
$man 7 signal
...
SIGCHLD 20,17,18 B Дочерний процесс остановлен или прерван
...
...
SIGCLD -,-,18 Синоним SIGCHLD
...
Буквы в столбце "Действие" означают:
...
B Игнорирование сигнала (определено по умолчанию).
...
--- cut hereКак еще иначе без перехвата сигнала при завершении потомков родитель продолжает жить, если все остальные действия это снятие или останов процесса, к которому пришел сигнал ? :))
С другой стороны получается, что "sigset(SIGCLD,SIG_IGN)" выполнять бессмысленно, потому что:
a) система уже это сделала;
б) зомби все равно остаются.Помоему так :)
Malenkij ishodnik:
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <signal.h>
#include <errno.h>
#include <string.h>
int main(int argc,char** argv)
{
sleep(1);
signal(SIGCLD,SIG_IGN);
int cpid=fork();
if(cpid==0)
{
//child
return 0;
}
fprintf(stderr,"Child pid %i\n",cpid);
sleep(1);
if(kill(cpid,0)<0)
{
fprintf(stderr,"Error, %s\n",strerror(errno));
}
else
{
fprintf(stderr,"OK\n");
}
return 0;
}Rezultat:
Child pid 21945
Error, No such process
Komenttariji:
Izpolzuju signal vmesto sigset ibo netu v mojom signal.h
funkciji sigset (Pomnju gdeto bika pod #ifdef POSIX......).
Potomok mozhet delatj exit ili return, ot etovo nichevo ne menjalosj, no mozhno probovatj ispolzovatj exit
(Ostorozno, ne budut vizvani destruktori localnih klasov).
Nu, vrode vsjo.
Udachi!
Jescho:
Stavil predku pered return bolshoj sleep,
i s drugova terminala proverjal nalichije potomka,
no pid potomka ne nashol.
Я еще раз говорю - если выбросить из твоего кода "signal(SIGCLD,SIG_IGN);", то ничего не изменится. То есть вообще ничего.
Izvini no ty ne prav.
V ishodnjike otkomentiroval strochku s signal,
v rezultate poluchil:> exe
Child pid 29477
OK
>S drugovo terminala:
> ps -fe | grep 29477
test 29477 29476 0 19:08 pts/4 00:00:00 [exe <defunct>]
test 29481 29218 0 19:08 pts/5 00:00:00 grep 29477
>Komanda signal(SIGCLD,SIG_IGN) govorit, shto process ne interesujet kak zakanchivajutsa potomki, i poetomu potomki
vikidivajutsa iz tablici procesov, ne dozhidajasj waitpid
ot predka.
Сдаюсь - ты меня победил :)
Только что же тогда значит строки в мане:Ign
Default action is to ignore the signal.
...
SIGCHLD 20,17,18 Ign Child stopped or terminated?
>Сдаюсь - ты меня победил :)
>Только что же тогда значит строки в мане:
>
>Ign
> Default action is to ignore the signal.
>...
>SIGCHLD 20,17,18 Ign Child stopped or
>terminated
>?Из комментария в linux/kernel/signal.c:
Note the silly behaviour of SIGCHLD: SIG_IGN means that the signal
isn't actually ignored, but does automatic child reaping, while
SIG_DFL is explicitly said by POSIX to force the signal to be ignored...
Угу. Понятно.