• Viernes 15 de Noviembre de 2024, 04:34

Autor Tema:  Ignorar señales  (Leído 2221 veces)

meana

  • Miembro activo
  • **
  • Mensajes: 36
    • Ver Perfil
Ignorar señales
« en: Jueves 10 de Mayo de 2012, 12:23 »
0
Hola

Estoy programando un pequeño shell y en estos momentos estoy intentando hacer que este sea inmune a ciertas señales como por ejemplo SIGINT (Ctrl+C), pero que no lo sean los procesos que este lanza. Por el momento lo único que consigo es que todos sean inmunes o en su defecto que no lo sea únicamente el primer proceso que lanzo, no se si me estare explicando muy bien sorry, os dejo el codigo de captura y tratamiento de señales que tengo hecho en ambas versiones a ver si alguno de vosotros me puede decir algo

Esta es la version en la que todos los procesos son inmunes
Código: [Seleccionar]
void Manejador(int sig) {
cout << "\n";
signal(sig, SIG_IGN);
}

int main() {
pid_t pid;

struct sigaction act;
act.sa_handler=Manejador;
act.sa_flags=0;
sigemptyset(&act.sa_mask);
sigaction(SIGINT, &act, NULL);
kill(pid, SIGINT);

Esta version son inmunes todos, menos el primer proceso que lanzo
Código: [Seleccionar]
void Manejador(int sig) {
if(sig==SIGINT) signal(SIGINT, SIG_IGN);
}

int main() {

signal(SIGINT, Manejador);


por cierto estoy programando en UNIX

meana

  • Miembro activo
  • **
  • Mensajes: 36
    • Ver Perfil
Re:Ignorar señales
« Respuesta #1 en: Viernes 11 de Mayo de 2012, 18:58 »
0
Bueno por si le sirve a alguien en algun momento me contestare a mi mismo...
La verdad al final resulto mas sencillo de lo que yo creia y como en casi todas estas cosas son tonterias de las que no te das cuenta en mucho tiempo. Bueno entrando en lo que importa.
Nada mas entrar en el main tienes que capturar la señal SIGINT e ignorarla directamente con el siguiente codigo:
Código: [Seleccionar]
struct sigaction sig;
sig.sa_handler=SIG_IGN;
sig.sa_flags=0;
sigemptyset(&sig.sa_mask);

sigaction(SIGINT, &sig, NULL);

Una vez hecho esto como los procesos hijos se crean mediante un fork debemos volver a colocar la accion a la señal como estaba para ello empleamos el siguiente codigo:
Código: [Seleccionar]
sig.sa_handler=SIG_DFL;
sig.sa_flags=0;
sigemptyset(&sig.sa_mask);

sigaction(SIGINT, &sig, NULL);
Este último trozo de codigo se debe de colocar la parte que ejecuta unicamente el proceso hijo, si no al padre le volveria a afectar el Ctrl+C

Espero que le pueda servir a alguien