2009-03-12 6 views
6

J'utilise la file d'attente de messages comme une adresse IP entre 2 programmes. Maintenant, je veux envoyer des données d'un programme à l'autre en utilisant la file d'attente de messages, puis intimez-le via un signal SIGINT. Je ne sais pas comment envoyer un signal d'un programme à un autre. Quelqu'un peut-il fournir un code d'échantillon s'il a la solution?comment envoyer le signal d'un programme à un autre?

Répondre

5

Le signal dans linux peut être envoyé en utilisant kill system call, vérifiez simplement ce link pour la documentation de l'appel et de l'exemple du système kill. vous pouvez voir l'homme -2 tuer aussi. et il est déconseillé d'utiliser SIGINT utiliser SIGUSR1 ou SIGUSR2

+0

Je tiens à ajouter: il est déconseillé de les utiliser, car ce sont des signaux standards. Il est préférable d'utiliser les signaux en temps réel, qui commencent à partir de SIGTRMIN. ils ont des avantages importants. – Tebe

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

comment obtenir le pid d'un autre processus dans ce programme. – Chaithra

+1

Il existe plusieurs façons de le faire. Si l'un est le parent de l'autre, le parent obtient le pid de l'enfant quand il appelle fork(), et l'enfant peut obtenir le parent avec getppid(). Si ce n'est pas le cas, vous pouvez mettre le pid dans un endroit convenu. Par exemple, un fichier que l'on écrit pour l'autre. –

+0

oui. D'accord. mais si c'est un autre programme ..? alors comment envoyer le processid à ce programme .. pouvons-nous envoyer en utilisant une socket? – Chaithra

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

Il s'agit d'une manière * très * désordonnée d'envoyer un signal d'un processus à un autre. Pourquoi ne pas utiliser les appels système kill() ou sigqueue()? – slacy

1

Notez qu'en utilisant l'appel système sigqueue(), vous pouvez passer un morceau supplémentaire de données ainsi que votre signal. Voici une brève citation de « l'homme 2 sigqueue »:

L'argument de valeur est utilisée pour spécifier un élément d'accompagnement des données (soit un entier ou une valeur de pointeur) pour être envoyé avec le signal, et a le type suivant:

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

Ceci est un moyen très pratique pour passer un petit peu d'information entre les 2 processus. Je suis d'accord avec l'utilisateur ci-dessus - utiliser SIGUSR1 ou SIGUSR2 et un bon sigval, et vous pouvez passer ce que vous voulez.

Vous pouvez également passer un pointeur sur un objet dans la mémoire partagée via sival_ptr, et passer un objet plus grand de cette façon.

Questions connexes