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