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);
    }

}
Je recommanderais contre en utilisant le même gestionnaire de signal pour les signaux comme 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