Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Señales en Linux

Estas en el tema de Señales en Linux en el foro de C/C++ en Foros del Web. Hola, Estoy realizando en c un programa que trabaja sobre Debian que crea varios hijos. Mi duda es: ¿existe alguna señal predetermianda del ssoo que ...
  #1 (permalink)  
Antiguo 19/08/2008, 08:15
 
Fecha de Ingreso: enero-2008
Mensajes: 122
Antigüedad: 16 años, 3 meses
Puntos: 0
Señales en Linux

Hola,

Estoy realizando en c un programa que trabaja sobre Debian que crea varios hijos. Mi duda es: ¿existe alguna señal predetermianda del ssoo que sea enviada al cada hijo cuando su padre muere? En caso negativo, ¿cómo podria implementarlo?

Saludos.


EDITO: Parece que no plantee bien mis dudas, añado un poco más:
- lo que busco es que el proceso padre sea asesinado por el sistema operativo o por otro proceso que no tenga nada que ver. Tengo entendido que si un proceso se encuentra consumiendo demasiada CPU, el ssoo lo mata.

Última edición por anterma; 22/08/2008 a las 01:34
  #2 (permalink)  
Antiguo 19/08/2008, 15:05
 
Fecha de Ingreso: febrero-2008
Mensajes: 241
Antigüedad: 16 años, 2 meses
Puntos: 1
Respuesta: Señales en Linux

Eso tienes que implementarlo mediante programacion por grupos, que todos los hijos formen un grupo y cuando el padre muera envie antes un mensaje a cada hijo y además los mate. Con pvm seria pvm_mcast para enviar el mensaje a todo el grupo y pvm_kill para ir matando a cada hijo
  #3 (permalink)  
Antiguo 19/08/2008, 22:11
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 3 meses
Puntos: 260
Sonrisa Respuesta: Señales en Linux

Hola,

Cita:
Iniciado por anterma Ver Mensaje
Hola,

Estoy realizando en c un programa que trabaja sobre Debian que crea varios hijos. Mi duda es: ¿existe alguna señal predetermianda del ssoo que sea enviada al cada hijo cuando su padre muere? En caso negativo, ¿cómo podria implementarlo?

Saludos.
Creo que no hay ninguna señal que envíe el padre al hijo cuando termina.
SIGCHLD es enviado por el hijo cuando termina. Pero puedes usar tu propia señal.
Como por ejemplo:

Código:
#include <errno.h>
#include <signal.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

static int child_pid = 0;
static int wstatus = 0;

static void def_handler(int sig)
{
  fprintf(stderr, "Señal de salida %d recibida.\n", sig);
}

int main()
{
  printf("proceso padre creado:%d.\n", getpid());

  if ((child_pid = fork()) < 0) {
    fprintf(stderr, "falló fork(). error:%d %s.\n",
      errno, strerror(errno));
    return 1;
  }

  if(child_pid == 0) {
    printf("proceso hijo creado:%d.\n", getpid());
    if (signal(SIGUSR1, def_handler) == SIG_ERR) {
      // el hijo va a recibir el mensaje SIGUSR1
      fprintf(stderr, "falló signal(SIGUSR1). error:%d %s.\n",
        errno, strerror(errno));
        exit(1);
    }
    pause(); // espera el mensaje
  } else {
    kill(child_pid, SIGUSR1); // el padre envía el mensaje que va a salir.
    wait(&wstatus); // espera a sus hijitos o se convierten en zombies / huerfanos. :)
  }

  printf("proceso muerto:%d.\n", getpid());
  return 0;
}
Saludos,
  #4 (permalink)  
Antiguo 20/08/2008, 01:38
 
Fecha de Ingreso: enero-2008
Mensajes: 122
Antigüedad: 16 años, 3 meses
Puntos: 0
Respuesta: Señales en Linux

Gracias HackmanC, lo probaré. Aunque no entiendo muy bien lo que hace el código, ¿cuando muere el padre también muere el hijo? ...

Saludos
  #5 (permalink)  
Antiguo 20/08/2008, 17:08
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 3 meses
Puntos: 260
Sonrisa Respuesta: Señales en Linux

Hola,

Cita:
Iniciado por anterma Ver Mensaje
... Aunque no entiendo muy bien lo que hace el código, ...
Que parte ?

Cita:
Iniciado por anterma Ver Mensaje
... ¿cuando muere el padre también muere el hijo? ...
En este ejemplo .. sí, pero es un poco confuso, el hijo espera con pause() que el padre le avise cuando terminar, el padre le envia un mensaje con kill() al hijo que deber terminarse, cuando muere el hijo por que el padre le avisó que se muriera (el hijo salio del pause), el padre espera con wait() hasta que se termine el hijo. Pero eso lo decides en la forma como diseñes la aplicación.

Revisa la documentación de pause(), wait(), kill() y signal().

En este ejemplo no era necesaria la funcion signal(SIGUSR1, def_handler) para que funcionara todo el proceso, pero te muestra como capturar la señal SIGUSR1.

Cuando muere el hijo pues es normal, pero cuando muere el padre y el hijo sigue corriendo, pasa a ser un huérfano y es adoptado por el proceso init #1. O cuando muere el padre y el hijo ya terminó su función (no está corriendo) pero nunca fué llamada la función wait, pasa a ser un zombie y el proceso init se encarga de darle sepultura (elimina el resultado de la tabla de procesos con una llamada parecida a wait lo antes posible).

Saludos,

ps:

... perdón por las analogías con la defunción, pero ... así ha estado escrita la documentación original.

Última edición por HackmanC; 20/08/2008 a las 17:50 Razón: ji,ji .. que tetrico ... :-)
  #6 (permalink)  
Antiguo 21/08/2008, 01:33
 
Fecha de Ingreso: enero-2008
Mensajes: 122
Antigüedad: 16 años, 3 meses
Puntos: 0
Respuesta: Señales en Linux

Muchas gracias! y perdona por molestarte tanto :$.
es una pena que no me sirva el código que me has posteado, porque es el propio proceso el que se suicida de forma establecida, yo lo que busco es que el proceso sea asesinado (:p) por el sistema operativo o por otro proceso que no tenga nada que ver. Lo que no se es si será posible lo que pido.

Saludos
  #7 (permalink)  
Antiguo 21/08/2008, 02:12
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 3 meses
Puntos: 260
Respuesta: Señales en Linux

Hola,

No es una pena, por que no lo escribí para que lo copiaras.

Es solamente un ejemplo para que comprendieras como hacer que un proceso recibiera una señal (de usuario) de otro proceso. E ilustrar como podrías hacer para que el proceso sea asesinado por otro proceso ... en este caso el padre.

El sistema operativo no va a matar ningún proceso por que sí y ya. ()
Otro proceso puede matar a otro proceso () sabiendo cual es su pid y enviándole el mensaje SIGKILL.

Cita:
Mi duda es: ¿existe alguna señal predetermianda del ssoo que sea enviada al cada hijo cuando su padre muere? En caso negativo, ¿cómo podria implementarlo?
Cita:
yo lo que busco es que el proceso sea asesinado (:p) por el sistema operativo o por otro proceso que no tenga nada que ver.
Cambiaste la pregunta inicial y es completamente diferente a la nueva interrogante, sería adecuado que formularas adecuadamente de nuevo te pregunta en otro Tema. Espero haber sido de alguna ayuda,

Saludos.

ps: Ya me deprimí de tanto asesinamiento de procesos ...

Última edición por HackmanC; 21/08/2008 a las 02:41 Razón: ji,ji ... por que no usaron TerminateProcess() o algo así ? .. haaa si ya sé ... :-)
  #8 (permalink)  
Antiguo 22/08/2008, 01:36
 
Fecha de Ingreso: enero-2008
Mensajes: 122
Antigüedad: 16 años, 3 meses
Puntos: 0
Respuesta: Señales en Linux

Gracias, HackmanC. He actualizado el primer mensaje para que quede más clara mi duda.

Cita:
Iniciado por HackmanC Ver Mensaje
El sistema operativo no va a matar ningún proceso por que sí y ya. ()
Si un proceso esta consumiendo mucha CPU el ssoo puede decidir matarlo, ¿no?

Saludos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 02:54.