LinuxForum.Fans
Тема

Может ли получить сигнал потомок от родителя, если сигнал: посылается

Автор: joub 4 сообщений 1498 просмотров
#296627

Может ли получить сигнал потомок от родителя, если сигнал: посылается всем (kill(0,SIGTERM)) а потомок был добавлен в группу.
Т.е. Создаем процессы, создаем группу, добавляем в группу процесс, и шлем всем процессам с помощью kill(0,SIGTERM) сигнал.
По идее мы должны получить от всех ответ, на практике же - получаем только от тех процессов - которые небыли добавлены в группу.
Если не создавать групп и не добавлять ничего - код работает и все процессы получают сигнал.
Вот пример кода.

text
#include <cstdlib>
#include <stdio.h>
#include <unistd.h>
#include <sys/shm.h>
#include <signal.h>
#include <sys/time.h>
#include <errno.h>
#include <wait.h>
 
void creat(int snum)
{
       printf("I got a SIGTERM %d\n",getpid());
       
       struct sigaction act;
       sigfillset(&act.sa_mask);
       act.sa_handler = SIG_DFL; // возвращаем обработчик по умолчанию!
       sigaction(SIGTERM, &act, NULL);
       kill(getpid(),SIGTERM); // посылаем самому себе SIGTERM для завершения
}
void creat0(int snum)
{
       printf("I am Father and I got a SIGTERM %d\n",getpid());
}
int pidF;
int main()
{
       int k;
       int p1,p2,p3,p4;
       pidF=getpid();
       p1=fork();
       p2=fork();
       p3=fork();
       
       
 
 
       
       if(p1==0){
           setpgid(getpid(),getpid()); // Создаем группу
       }
       if(p2==0){
           setpgid(0,p1); // Добовляем 2-й процесс в группу
       }
       
       
       
 
 
       signal(SIGTERM,creat);
       if (getpid()==pidF) 
               {
               printf("I am a Father %d\n",getpid());
               signal(SIGTERM,creat0); // установим обработчик creat0 только в 0 процессе!!!
 
               int c=fgetc(stdin);         //подождем пока все процессы не сформированы 
               kill(0,SIGTERM);         // посылаем всем  включая себя
               //возможно нужен wait() для корректного завершения;
               //(и не один!) и не только в 0 процессе
               
               // Вместо wait()
               sleep(2);
 
               return 0;
               
               }
       else
               {
               printf("I am a Son %d\n",getpid());
               while(1) k=k+1;
 
               return 0;
               }
}

Вот что в консоли...

text
jb@asus:~/NetBeansProjects/test2/dist/Debug/GNU-Linux-x86$ ./test2 
I am a Father 3633
I am a Son 3636
I am a Son 3635
I am a Son 3634
I am a Son 3638
I am a Son 3639
I am a Son 3637
I am a Son 3640
 
I got a SIGTERM 3636
I am Father and I got a SIGTERM 3633
I got a SIGTERM 3635
jb@asus:~/NetBeansProjects/test2/dist/Debug/GNU-Linux-x86$ ps -a
  PID TTY          TIME CMD
 3634 pts/0    00:00:03 test2
 3637 pts/0    00:00:04 test2
 3638 pts/0    00:00:03 test2
 3639 pts/0    00:00:04 test2
 3640 pts/0    00:00:03 test2
 3641 pts/0    00:00:00 ps
jb@asus:~/NetBeansProjects/test2/dist/Debug/GNU-Linux-x86$
#296658

собственно происходит всё как и должно быть:
сигнал получает только процесс p3 форкнутый последним от родителя, у него остаётся тот же pgid. все остальные устанавливают свой.

"joub" написал:
p1=fork();
p2=fork();
p3=fork();

if(p1==0){
setpgid(getpid(),getpid()); // Создаем группу
}
if(p2==0){
setpgid(0,p1); // Добовляем 2-й процесс в группу
}

вот это ахтунг какой-то... три форка подряд - это просто каша, а назначение этих условий совршенно не понятно...

#296702

а как узнать pgid текущего процесса ???

#296712
"joub" написал:
а как узнать pgid текущего процесса ???

getpgid() как ни странно...

Войдите или зарегистрируйтесь, чтобы ответить.