2009-03-12 14 views
6

estoy usando Message Queue como un ipc entre 2 programas. Ahora quiero enviar datos de un programa a otro utilizando la cola de mensajes y luego intimarlo a través de una señal SIGINT.cómo enviar la señal de un programa a otro?

No sé cómo enviar una señal de un programa a otro. ¿Alguien puede proporcionar un código de muestra si tienen la solución?

Respuesta

5

La señal en linux se puede enviar usando la llamada al sistema kill simplemente revise esto link para la documentación de la llamada al sistema kill y el ejemplo. puedes ver hombre -2 matar también. y no es aconsejable el uso de SIGINT uso SIGUSR1 o SIGUSR2

+0

Quiero agregar: no es aconsejable usarlos, porque son señales estándar. es mejor usar señales en tiempo real, que comienzan desde SIGTRMIN. ellos tienen algunas ventajas importantes. – Tebe

11
#include <sys/types.h> 
#include <signal.h> 
int kill(pid_t pid, int sig); 
+0

cómo obtener el pid de otro proceso en este programa. – Chaithra

+1

hay varias formas de hacerlo. Si uno es el padre del otro, el padre obtiene el pid del hijo cuando llama fork(), y el hijo puede obtener el padre con getppid(). Si este no es el caso, puede colocar el pid en una ubicación acordada. Por ejemplo, un archivo que uno escribe para el otro. –

+0

sí. De acuerdo. pero si es algún otro programa ...? entonces cómo enviar el processid a ese programa ... ¿podemos enviar usando un socket? – Chaithra

-4
system("kill -2 `pidof <app_name_here>` "); 
+1

Esta es una forma * muy * desordenada de enviar una señal de un proceso a otro. ¿Qué le parece usar las llamadas al sistema kill() o sigqueue()? – slacy

1

Tenga en cuenta que mediante el uso de la llamada al sistema sigqueue(), puede pasar una pieza extra de datos junto con su señal. He aquí una breve cita de "hombre 2 sigqueue":

El argumento de valor se utiliza para especificar un elemento de acompañamiento de los datos (ya sea un entero o un valor de puntero) para ser envió con la señal, y tiene el tipo siguiente:

 union sigval { 
     int sival_int; 
     void *sival_ptr; 
    }; 

Esta es una forma muy conveniente para pasar un pequeño fragmento de información entre 2 procesos. Estoy de acuerdo con el usuario anterior: use SIGUSR1 o SIGUSR2 y una buena señal, y puede pasar lo que quiera.

También podría pasar un puntero a algún objeto en la memoria compartida a través del sival_ptr, y pasar un objeto más grande de esa manera.

Cuestiones relacionadas