A la biblioteca estàndard C, el processament de senyals defineix com un programa gestiona diversos senyals mentre s'executa. Un senyal pot informar d'algun comportament excepcional dins del programa (com ara la divisió per zero), o un senyal pot informar d'algun esdeveniment asíncron fora del programa (com algú que toca una tecla d'atenció interactiva d'un teclat).

Senyals estàndard L'estàndard C defineix només 6 senyals. Tots estan definits a la capçalera signal.h (capçalera csignal en C++):

SIGABRT – "abortar", terminació anormal. SIGFPE - excepció de coma flotant. SIGILL – "il·legal", instrucció no vàlida. SIGINT – "interrupció", sol·licitud d'atenció interactiva enviada al programa. SIGSEGV – " infracció de segmentació ", accés a memòria no vàlid. SIGTERM – "acabar", sol·licitud de terminació enviada al programa.

La implementació pot especificar senyals addicionals a la capçalera signal.h. Per exemple, els sistemes operatius Unix i similars a Unix (com Linux) defineixen més de 15 senyals addicionals; vegeu senyal Unix.

Manipulació Es pot generar un senyal cridant al sistema raise() o kill(). raise() envia un senyal al procés actual, kill() envia un senyal a un procés específic.

Un controlador de senyal és una funció que l'entorn objectiu crida quan es produeix el senyal corresponent. L'entorn de destinació suspèn l'execució del programa fins que el controlador del senyal retorni o crida a longjmp().

Els controladors de senyal es poden configurar amb signal() o sigaction(). El comportament de signal() s'ha canviat diverses vegades al llarg de la història i es desaconsella el seu ús. Només és portàtil quan s'utilitza per establir la disposició d'un senyal a SIG_DFL o SIG_IGN. Es poden especificar gestors de senyals per a tots els senyals menys dos (SIGKILL i SIGSTOP no es poden atrapar, bloquejar ni ignorar).

Si el senyal informa d'un error dins del programa (i el senyal no és asíncron), el controlador del senyal pot acabar cridant abort(), exit() o longjmp().

Funcions FuncióDescripcióraiseenvia artificialment un senyal al procés de trucadakillenvia artificialment un senyal a un procés determinatsignalestableix l'acció realitzada quan el programa rep un senyal específic

Exemple d'ús #include <signal.h> #include <stdio.h> #include <stdlib.h>

static void catch_function(int signo) { puts("Interactive attention signal caught."); }

int main(void) { // Set above function as signal handler for the SIGINT signal: if (signal(SIGINT, catch_function) == SIG_ERR) { fputs("An error occurred while setting a signal handler.\n", stderr); return EXIT_FAILURE; } puts("Raising the interactive attention signal."); if (raise(SIGINT) != 0) { fputs("Error raising the signal.\n", stderr); return EXIT_FAILURE; } puts("Exiting."); return EXIT_SUCCESS; // exiting after raising signal }

Referències

Categoria:Llenguatge de programació C