Signal.h

De la Viquipèdia, l'enciclopèdia lliure
Signal.h

TipusC header file (en) Tradueix Modifica el valor a Wikidata
Part deC standard library, Biblioteca C POSIX i Biblioteca estàndard de C++ Modifica el valor a Wikidata
Característiques tècniques
PlataformaBiblioteca estàndard C

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).[1]

Senyals estàndard[modifica]

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

  • 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.[3]

Manipulació[modifica]

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().[4]

Funcions[modifica]

Funció Descripció
raise envia artificialment un senyal al procés de trucada
kill envia artificialment un senyal a un procés determinat
signal estableix l'acció realitzada quan el programa rep un senyal específic

Exemple d'ús[modifica]

#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[modifica]

  1. «<csignal> (signal.h)» (en anglès). [Consulta: 24 desembre 2023].
  2. ISO/IEC 9899:1999 specification (en anglès). 
  3. «The Open Group Base Specifications Issue 6 – signal.h – signals» (en anglès). [Consulta: 10 gener 2012].
  4. «signal.h(0p) - Linux manual page» (en anglès). [Consulta: 24 desembre 2023].