2016-03-27 11 views
1

Ich weiß wirklich nicht, was genau ich hier falsch mache. Ich möchte die PID eines Anrufers aus dem eingehenden Signal extrahieren, aber der Wert, den ich bekomme, ist völlig falsch.Falsche PID-Aufruf Prozess bei der Behandlung von Signal in C

Hier ist mein Code für "Fänger":

#include <stdio.h> 
#include <stdlib.h> 
#include <signal.h> 
#include <unistd.h> 

int SIGNALS_RECEIVED = 0; 
pid_t CALLING_PID; 

void signal_received(int sig, siginfo_t *info, void *context) { 
    SIGNALS_RECEIVED++; 

    if(SIGNALS_RECEIVED == 1) { 
     CALLING_PID = info->si_pid; 
     printf("%ld\n", (long) CALLING_PID); 
    } 
} 

int main() { 
    struct sigaction act; 
    act.sa_sigaction = &signal_received; 

    sigaction(SIGUSR1, &act, NULL); 

    while(1) { 

    } 

    return 0; 
} 

Und "Absender":

#include <stdio.h> 
#include <stdlib.h> 
#include <signal.h> 
#include <unistd.h> 

int main(int argc, char **argv) { 

    char line[10]; 
    FILE *cmd = popen("pidof -s catcher", "r"); 

    fgets(line, 10, cmd); 
    pid_t pid = strtoul(line, NULL, 10); 

    pclose(cmd); 

    int i; 
    for(i = 0; i < 400; i++) { 
     kill(pid, SIGUSR1); 
    } 

    kill(pid, SIGUSR2); 

    return 0; 
} 

Als Ergebnis, wenn auf den ersten Fänger läuft, und dann Absender, die ich erhalten:

./catcher 
398533948 
SIGNALS_RECEIVED: 24 

Während pid des Absenders:

ps aux | grep *sender 
maciej 4704 100 0.0 4328 1268 pts/13 R+ 22:46 0:15 ./sender 

Meine Linux-Version:

Linux version 4.2.0-34-generic ([email protected]) (gcc version 4.8.2 (Ubuntu 4.8.2-19ubuntu1)) #39~14.04.1-Ubuntu SMP Fri Mar 11 11:38:02 UTC 2016 

Antwort

0

Manpage für sigaction() lesen:

sa_handler die Aktion gibt an, mit signum verbunden sein ... Diese Funktion gibt die Signalnummer als einziges Argument erhält .

Das ist nicht das, was Sie wollen. Sie wollen, dass diese statt:

Wenn SA_SIGINFO in sa_flags angegeben wird, dann sa_sigaction (statt sa_handler) gibt die Signalbehandlungsfunktion für signum. Diese Funktion nimmt das Signal-Nummer als erstes Argument, einen Zeiger auf eine siginfo_t als zweites Argument ...

Sie hat keine der SA_SIGINFO Flag, wenn Sie den Handler installiert.

die folgende Zeile Code hinzufügen, bevor sigaction Aufruf:

act.sa_flags = SA_SIGINFO;