signal()
může být na některých operačních systémech nebezpečný a na Linuxu je zastaralý ve prospěch sigaction()
. "signál versus sigaction"
Zde je příklad, na který jsem nedávno narazil („Klepněte na signál přerušení“) a upravil jsem ho, když jsem si s ním hrál.
#include<stdio.h>
#include<unistd.h>
#include<signal.h>
#include<string.h>
struct sigaction old_action;
void sigint_handler(int sig_no)
{
printf("CTRL-C pressed\n");
sigaction(SIGINT, &old_action, NULL);
kill(0, SIGINT);
}
int main()
{
struct sigaction action;
memset(&action, 0, sizeof(action));
action.sa_handler = &sigint_handler;
sigaction(SIGINT, &action, &old_action);
pause();
return 0;
}
Pro úplný funkční příklad můžete vyzkoušet následující kód:
#include <signal.h>
#include <stdio.h>
#include <stdbool.h>
volatile bool STOP = false;
void sigint_handler(int sig);
int main() {
signal(SIGINT, sigint_handler);
while(true) {
if (STOP) {
break;
}
}
return 0;
}
void sigint_handler(int sig) {
printf("\nCTRL-C detected\n");
STOP = true;
}
Příklad spuštění:
[[email protected]]$ ./a.out
^C
CTRL-C detected
Musíte chytit SIGINT. Něco takového:
void sigint_handler(int sig)
{
[do some cleanup]
signal(SIGINT, SIG_DFL);
kill(getpid(), SIGINT);
}
načte více podrobností zde
Jaký je nejbezpečnější způsob, jak vyprázdnit adresář v *nix?
Jak vymažu tištěné znaky v konzolové aplikaci (Linux)?