The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"Как-бы мне узнать количество созданных с помощью fork() проц..."
Вариант для распечатки Архивированная нить - только для чтения! 
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"Как-бы мне узнать количество созданных с помощью fork() проц..."
Сообщение от Cker Искать по авторуВ закладки on 10-Ноя-02, 22:47  (MSK)
PS-ка их отображает как ./main
  Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

Индекс форумов | Темы | Пред. тема | След. тема
Сообщения по теме

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

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

  Рекомендовать в FAQ | Cообщить модератору | Наверх

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


  Рекомендовать в FAQ | Cообщить модератору | Наверх

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

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


  Рекомендовать в FAQ | Cообщить модератору | Наверх

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

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

  Рекомендовать в FAQ | Cообщить модератору | Наверх

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

  Рекомендовать в FAQ | Cообщить модератору | Наверх

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

8. "RE: Как-бы мне узнать количество созданных с помощью fork() ..."
Сообщение от XMan Искать по авторуВ закладки on 19-Дек-02, 20:33  (MSK)
Я еще раз говорю - если выбросить из твоего кода "signal(SIGCLD,SIG_IGN);", то ничего не изменится. То есть вообще ничего.
  Рекомендовать в FAQ | Cообщить модератору | Наверх

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

  Рекомендовать в FAQ | Cообщить модератору | Наверх

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

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

?

  Рекомендовать в FAQ | Cообщить модератору | Наверх

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


  Рекомендовать в FAQ | Cообщить модератору | Наверх

12. "RE: Как-бы мне узнать количество созданных с помощью fork() ..."
Сообщение от XMan Искать по авторуВ закладки on 23-Дек-02, 22:38  (MSK)
Угу. Понятно.
  Рекомендовать в FAQ | Cообщить модератору | Наверх


Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру