domingo, 2 de diciembre de 2012

Coñecendo as sinais de Unix [GNU/Linux]

Os procesos Unix reciben sinais cando un evento "excepcional" acontece, isto pode ser por que o usuario interrumpe o proceso automáticamente ou de forma manual (sóabos o de deter procesos con Control-C, pois envía unha sinal), por que intentou acceder a unha posición de memoria que non lle corresponde (o infame "Segmentation fault") ou quizais por que intenta executar unha intrucción inválida (ben, isto é menos habitual, pero pode acontecer)... enfin que hai unha boa manchea delas pero normalmente quedamos nas máis coñecidas, hoxe ímos ver as que utiliza Linux (poden variar sutilmente entre os distintos sistemas operativos).

  1. SIGHUP (Hangup - Colgar): Indica o peche do terminal, por exemplo polo peche da interfaz, se é remoto podería indicar a interrupción da conexión.
  2. SIGINT (Interruption - Interromper): A sinal que indica que o usuario quere deter o proceso, é o sinal que produce a combinación Control-C.
  3. SIGQUIT (Quit - Pechar): Esta tamén indica o proceso a súa detencion e segundo o sistema pode provocar que expoña un volcado da memoria, esto permitiría explorar o estado actual do proceso en maior profundidade, pódese lanzar con Control-\.
  4. SIGILL (Illegal - Ilegal): Se o procesador atopa que debe executar unha instrucción que non existe ou non está implementada nese modelo, quizais podería servir para intentar por defecto usar a implementación por hardware dunha función (por exemplo, existen modelos de CPU que implementan opcodes para CRC32), e se non existe utilizar a versión por software.
  5.  SIGTRAP (Trap - Atrapar): Xeralmente unha destas sinais xurxe cando se produce unha condición predefinida, habitualmente por un depurador.
  6. SIGABRT (Abort - Abortar): Esta sinal só a pode lanzar o propio proceso a si mesmo, o seu obxectivo e producir a súa detención de forma inmediata, é o que acontece cando un assert() faia na linguaxe C.
  7. SIGBUS: Sinala un erro de bus, isto soe significar un acceso incorrecto (por exemplo, por non respetar o aliñamento) a un segmento de memoria válido.
  8. SIGFPE (Float Point Error - Erro de punto flotante): Cando o procesador tenta evaluar unha operación aritmética erronea (coma dividir por 0), sinalao deste xeito.
  9. SIGKILL (Kill - Matar): A peculiaridade desta sinal de detención é que non é posible evita-lo seu efecto, mentres que as outras sinais podense "cazar" e continuar co proceso non existe esa posibilidade neste caso.
  10. SIGUSR1: Esta sinal non está ligada a unha semántica concreta (non ten un "significado"), senon que o proceso define a súa utilidade, por exemplo no caso de `dd` fai que amose as estadísticas de IO.
  11. SIGSEGV (Segmentation fault - Faio de segmentación): Ben... o nome require unha pequena explicación, non significa que houbera un erro no proceso de segmentación, no caso de memoria un "faio" quere dicir que se tenta referenciar algo que non está alí (un faio de cache e o intento de acceder a algo que non está na cache e obriga a buscalo na memoria), neste caso o erro está no intento de acceder a un segmento de memoria que non existe.
  12. SIGUSR2: Pois coma SIGUSR1 :P
  13. SIGPIPE (Pipe - Tubería): Algunha vez un proceso deu queixa por que a tubería de saída estándar rompeu ("Broken pipe")? recebeu esta sinal que quere dicir que intenta escreber nunha tubería cando ninguén escoita no outro extremo.
  14. SIGALRM (Alarm - Alarma): Unha sinal definida en POSIX, que funciona coma (adiviñade) unha alarma, indicando que xa transcorreu unha cantidade de tempo establecida.
  15. SIGTERM (Terminate - Terminar): Unha sinal (comunmente lanzada por outro proceso) que tenta matar o proceso, a diferenza da 9 (SIGKILL) esta pódese cazar. É o sinal que envía por defecto o comando `kill`.
  16. SIGSTKFLT (STacK FauLT - Faio na pila): Sinala un faio na pila do coprocesador, polo nome espero que sexa algo pouco común.
  17. SIGCHLD (Child - Nen@): Indica que un dos procesos que surxiron dese rematou. Alguén ten problemas cun programa que acaba con moitos zombies? se caza esta sinal e fai wait() finiqutaos dun golpe.
  18. SIGCONT (Continue - Continúa): Provoca que o proceso continúe a súa andanza unha vez que e detido por exemplo por a seguinte sinal...
  19. SIGSTOP (Stop - Deter): Fai que o proceso se deteña de forma temporal (revesible a través de SIGCONT), moi útil se temos un proceso que tira moito da CPU e necesitamos que deteña ese consumo de forma momentanea e non queremos perde-lo progreso.  Non se pode cazar.
  20. SIGTSTP (Terminal stop): Ten o mesmo efecto que o sinal anterior, coa diferencia que é posible cazala, pódese invocar con Control-Z.
  21. SIGTTIN (TTY IN): Indicalle a un proceso que tenta ler da terminal que está en segundo plano.
  22. SIGTTOU (TTY OUT): Funciona coma a anterior, só que intercambia a lectura pola escritura.
  23. SIGURG (Urgent - Urxente): TCP define a posibilidade de enviar datos "urxentes" fora de banda, isto é o que produce esta sinal.
  24. SIGXCPU (Exceeded CPU - CPU excedida): Nun sistema GNU/Linux existe a posibilidade de limitar o uso da CPU por un proceso, no caso de que iso aconteza esta sinal danos a posibilidade de garda-lo traballo feito rápidamente antes da recepción do SIGKILL.
  25. SIGXFSZ (File Sistem Exceeded - Sistema de arquivos excedido): Coma no caso anterior, o sistema de arquivos provee da posibilidade de limitar-lo seu uso, isto é do que avisa este sinal.
  26. SIGVTALRM (Virtual alarm - Alarma virtual): De forma similar a SIGALRM, indica que un contador de tempo establecido chegou a 0, se no caso do sinal 14 o tempo considerado era o tempo real, neste caso é o tempo que a CPU executou proceso.
  27. SIGPROF: Seguimos coas sinais, esta considera tanto o tempo que a CPU adicou o proceso coma as chamadas o sistema producidas polo proceso.
  28. SIGWINCH: Non especificada por POSIX, esta sinal indica un cambio no tamaño da terminal que controla o proceso.
  29. SIGIO (IO): Sinala a posibilidade de realizar accions de entrada saída.
  30. SIGPWR (Power - Enerxía): Cando se detecta un problema co suministro de enerxía aparece este sinal, supoño que terá que ver con sistemas coma SAI's.
  31. SIGSYS (System - Sistema): Unha chamada o sistema soe tomar un certo número de argumentos, cando un deles é incorrecto xerase esta sinal... mellor non ter que facer uso dela. 


    Para rematar, podemos atopar as secuencias que xeran as distintas sinais con `stty -a` e unha guía das distintas sinais con `man 7 signal`.

    Saúdos, espero que atoparades cousas interesantes ;)

    No hay comentarios:

    Publicar un comentario