De la CIB à l'aide des Signaux sur linux
Il est possible de faire IPC (inter process communication)
à l'aide du signal de capture de signal et d'augmenter?
J'ai fait deux programmes. Dans le premier programme que j'ai fait la manipulation de signaux, et dans l'autre programme, j'ai juste soulevé signal que j'ai à gérer dans un autre programme. J'ai ts fonctionne très bien pour moi, mais je veux faire de la communication entre ces deux programmes à l'aide des signaux et aussi voulez nous envoyer des octets de données avec ce lever de signal. Comment puis-je faire cela?
Je veux passer des messages avec le signal de la également. Puis-je le faire? Il est possible?
Et aussi, quels sont les inconvénients et les avantages des mécanismes IPC à l'aide de signaux?
Voici de travail code de mes deux programmes. Ising cela, je suis en mesure de lever des signaux et de capture des signaux, mais je veux passer des données d'un programme à l'autre.
Dans le deuxième programme, j'ai utilisé le premier ID de processus. Comment puis-je la rendre dynamique.?
premier programme :
/* Example of using sigaction() to setup a signal handler with 3 arguments
* including siginfo_t.
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <string.h>
static void hdl (int sig, siginfo_t *siginfo, void *context)
{
printf("sig no = %d \n", sig);
if(sig == SIGINT)
exit(0);
printf ("Sending PID: %ld, UID: %ld\n",
(long)siginfo->si_pid, (long)siginfo->si_uid);
}
int main (int argc, char *argv[])
{
struct sigaction act;
sigemptyset(&act.sa_mask);
act.sa_sigaction = &hdl;
act.sa_flags = SA_SIGINFO;
if (sigaction(SIGUSR1, &act, NULL) < 0) {
perror ("sigaction SIGUSR1");
return 1;
}
if (sigaction(SIGINT, &act, NULL) < 0) {
perror ("sigaction SIGINT");
return 1;
}
while (1)
{
sleep(1);
}
return 0;
}
deuxième programme
#include <stdio.h>
#include <signal.h>
void main(void)
{
while (1)
{
sleep(1);
kill(11558, SIGUSR1);
}
}
SIGINT
et SIGUSR1
. Gardez vos gestionnaires de signaux comme distincte que possible.Comment puis-je faire, que Peut-u s'il vous plaît me donner le lien ou quelques tutoriels que j'ai trouvé beaucoup de sur Google mais je n'ai pas eu quoi que ce soit.
Simplement utiliser deux différents
sigaction
structures pour les deux appels différents, chacun avec sa propre fonction de gestionnaire.En-dessous de la Réponse tout le monde dit que nous pouvons envoyer des données via des signaux. donc faire son possible
printf() n'est pas async un signal fort. Donc, vous ne devez pas appeler à partir de votre gestionnaire. Voir SIG30-C. Appel uniquement asynchrone-les fonctions de sécurité dans les gestionnaires de signaux et CWE-828: Gestionnaire de Signal avec une Fonctionnalité qui n'est pas Asynchrone-Safe.
OriginalL'auteur user1089679 | 2012-06-21
Vous devez vous connecter pour publier un commentaire.
Les signaux sont destinés à fournir une forme rudimentaire de contrôle d'un processus, et non comme un mécanisme IPC. Les signaux ont plusieurs problèmes lorsqu'ils sont utilisés comme autre chose:
Beaucoup d'appels système est interrompu par un signal, et ont besoin d'un traitement spécial.
En conséquence, beaucoup de code dans la nature n'est pas le signal fort.
Signaux de n'importe quel type de contenu des données, sauf pour eux-mêmes. Cela rend la plupart du temps inutile en tant que méthode de passage de message.
Il ya seulement tellement que vous pouvez faire dans un gestionnaire de signal.
Plus important encore, les signaux suivants du même type ne sont pas mis en file d'attente - ils sont fusionné dans une instance.
Encore plus important, il n'y a aucune garantie que les signaux sont livrées dans le même ordre qu'ils ont été générés. À partir de la page de manuel:
Vous pourriez théoriquement être capable de mettre en place une sorte de canal à l'aide de plusieurs signaux aller et retour, avec un peu de théâtre, comme une sorte d'accusé de réception, mais aucune personne saine d'esprit aurait envie de tenter quelque chose comme ça. Vous pourriez tout aussi bien utiliser des signaux de fumée à la place...
OriginalL'auteur thkala
Oui et non. En considérant uniquement les signaux, vous pouvez envoyer un signal à un autre processus, mais vous ne pouvez pas envoyer autre chose que simplement un signal.
Non, pas la façon dont vous essayez de. Vous pouvez utiliser des sockets, des fichiers, des tuyaux ou des tubes nommés pour ce faire. Si vous voulez en savoir plus sur les IPC UNIX, lire Advanced Programming in the UNIX Environment.
OriginalL'auteur Jay Sullivan
Non, n'essayez pas de les utiliser des signaux pour cela. Vous ne pouvez pas attacher des données supplémentaires avec des signaux autres que les siginfo struct. Le principal problème de l'utilisation des signaux, c'est que si peu de signal est fort. Vous devez éviter à peu près tous la C runtime routines, et assurez-vous que la réception de programme ne EINTR vérifie sur l'ensemble de son noyau appels. La seule chose que vous pouvez dire sur le moment où un signal se produit est qu'il ne sera pas comme vous l'attendiez (un peu comme l'Inquisition espagnole).
Je vous suggère de regarder dans les autres mécanismes IPC, tels que la mémoire partagée, les files d'attente fifo (named pipes), et les sockets.
OriginalL'auteur cdarke
Sauf dans un cas précis, que j'ai rencontré les signaux ne sont généralement pas utiles en tant que mécanisme IPC.
La seule fois où j'ai utilisé des signaux dans le cadre d'un mécanisme IPC lorsque vous devez interrompre le flux normal de fonctionnement de l'marqué processus pour gérer quelque chose, par exemple un timer interrupt. Le signal ( ont utilisé des signaux avec boost de la mémoire partagée pour mettre en œuvre inter-processus de gestion des événements. La mémoire partagée contient une liste d'événements qui ont besoin de traitement et le signal est utilisé pour démarrer le processus pour traiter ces événements. Ces événements sont out-of-band et imprévisible donc à l'aide d'un signal était idéal. J'ai effectué considérable de tests pour vérifier la mise en œuvre (et c'était dur pour obtenir tout stable).
Ce sigqueue avec le signal SIGRTMIN+1 dans un environnement Linux à l'aide de la glibc et à l'aide de SA_RESTART sur le sigaction permettra d'éviter de devoir gérer directement EINTR voir la glibc: Primitives Interrompu par des Signaux. BSD est un système similaire de sorte EINTR la manipulation n'était pas nécessaire dans mon système. Tous les points soulevés par les autres réponses ont été considérées et traitées (et testé).
Toutefois, si vous voulez juste pour transmettre des valeurs en arrière et en avant dans le fonctionnement normal du processus, puis un autre de l'IPC telles que les sockets, des fichiers, des tuyaux ou des tubes nommés sont mieux. Si vous pouvez utiliser ZeroMQ, puis encore mieux que qui fait beaucoup de travail dur pour vous dans un cadre très élégant.
OriginalL'auteur Richard Harrison