Linux und Signale


Zwischen verschiedenen Prozessen, Tasks, Threads wird immer wieder eine Kommunikationsmöglichkeit benötigt. Unter Umständen reicht hierbei schon einfach eine
Signalfunktion.

#include <iostream>
#include <sys/types.h>
#include <unistd.h>
#include <signal.h>

using namespace std;

int counterInt=0, counterQuit=0, counterUsr1=0, counterUsr2=0;
int counterChild=0,  maxCounter=1000000000;

void sigfkt(int snr) {

    switch(snr) {
    
        case SIGINT:
            counterInt++;
            cout << "### SIGINT ###\n"
                 << "Zaehler SIGINT:  " << counterInt << "\n"
                 << "Zaehler SIGQUIT: " << counterQuit << "\n"
                 << "Zaehler SIGUSR1: " << counterUsr1 << "\n"
                 << "zaehler SIGUSR2: " << counterUsr2 << "\n";
            signal(SIGINT,sigfkt);
            break;
           
        case SIGQUIT:
            counterQuit++;
                counterChild=maxCounter;
            cout << "### SIGQUIT ###\n";
            signal(SIGQUIT,sigfkt);
            break;
           
        case SIGUSR1:
            counterUsr1++;
            counterChild=0;
            cout << "### SIGUSR1 ###\n";
            signal(SIGUSR1,sigfkt);
            break;
           
        case SIGUSR2:
            counterUsr2++;
            cout << "### SIGUSR2 ###\n"
                 << "Laufvariable counterChild: " << counterChild << endl;
            signal(SIGUSR2,sigfkt);
            break;
           
        default:
            exit(0);
           
    }
           
   
    return;
}
   
int main() {
    int signr;
    pid_t pid, ppid;
   
    pid=fork();
   
    switch(pid) {
        case -1:
            perror("fork");
            exit(1);
           
        case 0:
            pid=getpid();
            ppid=getppid();
           
            signal(SIGINT,sigfkt);
            signal(SIGQUIT,sigfkt);
            signal(SIGUSR1,sigfkt);
            signal(SIGUSR2,sigfkt);
                       
           
            cout << "ChildID: " << pid << "\tParentID: " << ppid << endl;
           
            for(counterChild=0; counterChild<=maxCounter; counterChild++) {
                if(counterChild%10000000==0) {
                cout << "counterChild:  " << counterChild << endl;;
                }
            }
           
            exit(0);
           
        default:
            int pid=getpid();
            int counterParent=0;
            int status=0;
           
            for(signr=1; signr<SIGRTMAX; signr++)
                signal(signr, SIG_IGN);
           
            for(counterParent=0; counterParent<=maxCounter; counterParent++)
                if(counterParent%10000000==0)
                cout << "counterParent: " << counterParent << endl;;
       
            wait(&status);

            printf("Child-Status = |%x | %x |", (status >>8)& 0xFF,status & 0x7F);
                                    }
            exit(0);   
   
    return 0;
}