2009-03-12 5 views
6

sto usando la coda dei messaggi come ipc tra 2 programmi. Ora voglio inviare i dati da un programma a un altro utilizzando la coda dei messaggi e quindi intimo attraverso un segnale SIGINT.come inviare il segnale da un programma all'altro?

Non so come inviare un segnale da un programma a un altro. Qualcuno può fornire un codice di esempio se hanno la soluzione.

risposta

5

Il segnale in linux può essere inviato utilizzando la chiamata di sistema kill, controllare questo link per la documentazione della chiamata di sistema kill ed esempio. puoi vedere anche l'uomo -2 uccidere. e non è consigliabile utilizzare SIGINT uso SIGUSR1 o SIGUSR2

+0

Voglio aggiungere: non è consigliabile usarli, perché sono segnali standard. è meglio usare i segnali in tempo reale, che iniziano da SIGTRMIN. hanno alcuni importanti vantaggi. – Tebe

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

come ottenere il pid di altri processi in questo programma. – Chaithra

+1

ci sono diversi modi per farlo. Se uno è genitore dell'altro, il genitore riceve il pid del bambino quando chiama fork(), e il figlio può ottenere il genitore con getppid(). Se questo non è il caso, puoi inserire il pid in un luogo concordato. Ad esempio, un file che uno scrive per l'altro. –

+0

si. ok. ma se è un altro programma ..? allora come inviare il processid a quel programma .. possiamo inviare usando un socket? – Chaithra

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

Questo è un modo * molto * disordinato per inviare un segnale da un processo a un altro. Che ne dici di usare le chiamate di sistema kill() o sigqueue()? – slacy

1

Nota che utilizzando la chiamata di sistema sigqueue(), è possibile passare un ulteriore pezzo di dati con il vostro segnale. Ecco una breve citazione da "man 2 sigqueue":

L'argomento valore viene utilizzato per specificare un elemento di accompagnamento dei dati (sia un intero o un valore di puntatore) per essere inviato con il segnale, e ha il tipo seguente:

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

Questo è un modo molto conveniente per passare un piccolo pezzo di informazioni tra 2 processi. Sono d'accordo con l'utente sopra - usa SIGUSR1 o SIGUSR2 e un buon segnale, e puoi passare quello che vuoi.

È anche possibile passare un puntatore a un oggetto nella memoria condivisa tramite sival_ptr e passare in questo modo un oggetto più grande.