Может ли получить сигнал потомок от родителя, если сигнал: посылается всем (kill(0,SIGTERM)) а потомок был добавлен в группу.
Т.е. Создаем процессы, создаем группу, добавляем в группу процесс, и шлем всем процессам с помощью kill(0,SIGTERM) сигнал.
По идее мы должны получить от всех ответ, на практике же - получаем только от тех процессов - которые небыли добавлены в группу.
Если не создавать групп и не добавлять ничего - код работает и все процессы получают сигнал.
Вот пример кода.
#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;
}
}Вот что в консоли...
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$