Ich soll einen Signal-Handler implementieren, der alle Threads im Programm beim ersten Aufruf eines bestimmten Signals stoppt und sie wieder aufnimmt, wenn sie bereits gestoppt sind. I umgesetzt einen Dämon-Thread im Hintergrund ausgeführt werden mit dem folgenden Code:sigtimedwait und Erkennung von Signalen
void *handle_sig(void *arg)
{
sigset_t set;
//set set...
struct timespec to;
to.tv_sec = 1;
to.tv_nsec = 0;
while (_keepListening) {
int ret = sigtimedwait(&set, NULL, &to);
if (ret < 0)
if (errno == EAGAIN) {
continue; /* no signal sent*/
} else {
fprintf(stderr, "Failed...\n");
exit(1);
}
if (_state == PAUSE_STATE) { /* was blocked*/
//do something
} else {
` //do something else
}
}
return NULL;
}
Das Problem ist, dass, wenn ein Signal gesendet wird, und erfaßt wird, und dann wird eine andere gesendet, bevor die while-Schleife wieder eingegeben wird - das zweite Signal ignoriert, wodurch das Programm für immer stehen bleiben kann. Gibt es eine Möglichkeit festzustellen, ob seit dem letzten Aufruf von sigtimedwait ein Signal gesendet wurde?
Vielen Dank
Signale sind eine Art boolesche Funktion. Entweder ein Signal ist aktiv oder nicht, es gibt keinen Zähler oder eine Warteschlange, wenn das gleiche Signal zweimal vor der ersten auftritt. –