Foro de elhacker.net

Sistemas Operativos => GNU/Linux => Mensaje iniciado por: jordibr7 en 6 Diciembre 2013, 11:10 am



Título: Signals Linux
Publicado por: jordibr7 en 6 Diciembre 2013, 11:10 am
Hola a todos,

Soy nuevo por aquí, aunque entre varias veces, nunca comenté pero hoy me atreví! Mira os cuento, tengo una duda con las señales que se pueden enviar a un proceso. Tengo un programa que crea un hijo y los dos procesos, capturan la señal SIGINT (Ctrl+c). Es más o menos así:

#include <signal.h>
#include <stdio.h>

void pHijo(int x){
   printf("Soy el hijo\n");
}


void pFather(int x){
   printf("Soy el padre\n");
}

int main(int argc, char* argv[]){
   
   if(fork()==0){
      signal(SIGQUIT, pHijo);
   }else{
      signal(SIGQUIT, pFather);
   }

   while(1)
      pause();
}

Mi duda entra, si mando:
kill -SIGINT pid_proceso_padre
Sale por pantalla:
Soy el padre

Hasta aquí todo normal, pero cuando mando ctrl+c sale:
Soy el padre
Soy el hijo

Entiendo yo que el hijo recibe la señal, pero porqué? quien es el que se la manda, bash no puede ser porqué si cambio el intérprete en /etc/passwd logeo con el usuario que le cambie el intérprete aprieto ctrl+c y salen los dos mensajes. Quien es el encargado de enviar la señal a los procesos cuando hago ctrl+c? Es que no encuentro documentación... Gracias!




Título: Re: Signals Linux
Publicado por: desikoder en 9 Diciembre 2013, 22:23 pm
Veamos , no estoy seguro del todo de lo que te esta pasando pero te explico :
En primer lugar , da igual que cambies de shell , las shells al pulsar CTRL + C envian un SIGINT al proceso actual que este usando el TTY de la shell. Por tanto debes de tener en cuenta que al pulsar CTRL + C se envia un sigint , la gracia del asunto es que probablemente bash este enviando el SIGINT a todos los procesos que usen este TTY , y de ahi que se lanzen tanto el print del padre como el del hijo

De todos modos voy a compilarlo y a probar mi hipotesis en mi ordenador , luego actualizare el post

EDITO :

He estado compilandolo y haciendo pruebas en mi ordenador , ocurre lo que tu comentas por cierto , cambia en tu code SIGQUIT por SIGINT , si no no funciona

Te recuerdo que en unix si un proceso recibe una señal sus hijos la reciben , por ejeplo si matas el proceso init matarias el resto de procesos , y el asunto este se define al lanzar un nuevo proceso , si dependera de su proceso padre o algo , creo que es asi , bueno , mañana seguire investigandolo

Saludos