URL: https://www.opennet.ru/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 1095
[ Назад ]

Исходное сообщение
"Как-бы мне узнать количество созданных с помощью fork() процессов???"

Отправлено Cker , 10-Ноя-02 22:47 
PS-ка их отображает как ./main

Содержание

Сообщения в этом обсуждении
"RE: Как-бы мне узнать количество созданных с помощью fork() процессов???"
Отправлено Bob , 13-Ноя-02 16:35 
>PS-ка их отображает как ./main

В самой программе встрой счетчик запуска вызова fork() и выведи результат.


"RE: Как-бы мне узнать количество созданных с помощью fork() процессов???"
Отправлено Cker , 14-Ноя-02 15:00 
Да, но этот счетчик будет только наращиваться, а мне его еще и как-то уменьшать надо. Можно наворотить разделяемую память, но может есть более простой способ?



"RE: Как-бы мне узнать количество созданных с помощью fork() процессов???"
Отправлено XMan , 14-Ноя-02 15:47 
А что, ты ожидать завершения потомков не будешь ? Будешь плодить зомбей ? :)
Вешаешься на сигнал SIGCHLD и в нем уменьшаешь счетчик. Где будет храниться счетчик - локально или в разделяемой памяти - уже не важно.

"RE: Как-бы мне узнать количество созданных с помощью fork() ..."
Отправлено RT , 13-Дек-02 21:49 
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 и в нем уменьшаешь счетчик. Где будет храниться
>счетчик - локально или в разделяемой памяти - уже не важно.
>



"RE: Как-бы мне узнать количество созданных с помощью fork() ..."
Отправлено XMan , 14-Дек-02 01:20 
По поводу "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) система уже это сделала;
б) зомби все равно остаются.

Помоему так :)


"RE: Как-бы мне узнать количество созданных с помощью fork() ..."
Отправлено RT , 19-Дек-02 18:37 
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!


"RE: Как-бы мне узнать количество созданных с помощью fork() ..."
Отправлено RT , 19-Дек-02 18:40 
Jescho:
Stavil predku pered return bolshoj sleep,
i s drugova terminala proverjal nalichije potomka,
no pid potomka ne nashol.

"RE: Как-бы мне узнать количество созданных с помощью fork() ..."
Отправлено XMan , 19-Дек-02 20:33 
Я еще раз говорю - если выбросить из твоего кода "signal(SIGCLD,SIG_IGN);", то ничего не изменится. То есть вообще ничего.

"RE: Как-бы мне узнать количество созданных с помощью fork() ..."
Отправлено RT , 23-Дек-02 20:10 
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.


"RE: Как-бы мне узнать количество созданных с помощью fork() ..."
Отправлено XMan , 23-Дек-02 21:39 
Сдаюсь - ты меня победил :)
Только что же тогда значит строки в мане:

Ign
Default action is to ignore the signal.
...
SIGCHLD   20,17,18   Ign   Child stopped or terminated

?


"RE: Как-бы мне узнать количество созданных с помощью fork() ..."
Отправлено vnp , 23-Дек-02 22:32 
>Сдаюсь - ты меня победил :)
>Только что же тогда значит строки в мане:
>
>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...



"RE: Как-бы мне узнать количество созданных с помощью fork() ..."
Отправлено XMan , 23-Дек-02 22:38 
Угу. Понятно.