[Linux] - Señal

señal

En primer lugar, ¿qué señal?

¿Qué señal? Para castañas, tales como semáforos, la campana de clase, etc., es una señal, un mensaje a la gente. En Linux, la señal es una interrupción de software, se ha producido un proceso de notificación de eventos, la interrupción se ejecuta la operación del proceso actual, para hacer frente a este evento, la señal que representa el evento.
Hay una variedad de señales, representan cada uno un evento diferente.

  • El ciclo de vida de la señal :
    la generación de señales, registrada en el proceso, destruye el procesamiento de señales, señal de [inserte aquí la descripción de la fotografía]!
    Aquí Insertar imagen Descripción

  • Tipos de señales:
    Antes de esto, lo primero que entender lo que es una señal fiable, lo que es una señal fiable?
    Por ejemplo, el profesor de la clase asignado un trabajo dos veces, pero con el tiempo frente a este proceso dos veces para completar el trabajo, lo cual es una señal fiable, pero la señal no es fiable, el equivalente a un mal estudiante, sólo tenía un trabajo, otro puesto de trabajo una vez perdida. Por eso, utilizamos el comando kill -l para ver el tipo de señal:

    1-31 señales fiables no causa evento de pérdida
    34-64 señal no fiable puede resultar en eventos de pérdida

En segundo lugar, los conceptos de señal

  • La entrega de la señal: el procesamiento de señales de la implementación real de la señal de acción registrada en el proceso: el sistema operativo para modificar una bandera de la señal en el proceso de PCB
  • señales En espera de: generar una señal de estado de entre la entrega pendiente de las señales que se refiere, en pocas palabras, una condición está pendiente, en espera de ser procesada
  • Enmascaramiento de la señal (de bloqueo): el proceso temporalmente no es aceptar ciertas señales, si la señal se transmite al proceso de la máscara en el dispositivo de escudo, la señal no puede ser capturado en la ciudad; enmascaramiento de la señal después de un período de tiempo si el proceso de liberación, la señal se capturó
  • No haga caso de las señales: el proceso ha sido alcanzar el proceso de destino, pero el proceso de destino no trata directamente descartado

En tercer lugar, la generación de una señal de

   (1)硬件产生
  • ctrl + c produce una señal sustancialmente SIGINT, terminar el proceso;
  • Ctrl + \ SIGQUIT se genera la señal, y el proceso para la terminación de un volcado de memoria (archivo del núcleo, lo que equivale a las últimas palabras, almacenar datos operativos para facilitar la posterior depuración);
  • señal z SIGTSTP ctrl + generado, los concluido el proceso de primer plano.
    (2) software para producir
  • Llama a la función signum kill PID: proceso envía una señal para especificar una específica
  • función de elevación: el envío de una señal al proceso actual
  • aborto de la función: el envío de una señal de SIGABRT a sí mismo, provocando proceso de terminación anormal
  • alarma (int segundos): expresado su alarma cuando se llama a esta función, segundos de espera segundos para enviar a sí mismo una señal equivalente a un temporizador

En cuarto lugar, la señal de registro

信号在进程中的注册说白了就是操作系统修改进程pcb中的一个信号标志位

En el pcb tiene un mapa de bits, el mapa de bits es una de una pequeña celosía, el estado inicial es 0, como se muestra abajo, lo que indica que no hay señal de entrada, una vez que el sistema operativo envía una señal a un proceso, tal como el sistema operativo envía una No. 2 de la señal, entonces el tiempo será No. 2 cuadrícula se establece a 1, lo que indica que el proceso actual recibe una señal No. 2 mientras se cambia una bandera.
Aquí Insertar imagen Descripción
Y aquí es una colección de espera de señal pendiente hemos dicho antes.
En este punto ya sabemos, el proceso de registro de la señal realmente se haya modificado la bandera de mapa de bits, a decir del proceso de llegar a este evento, y que si este es el caso: el sistema envía una serie de señales de dos, que establece la señal II de la bandera 1, antes de que no está siendo tratada la señal, su bandera es 1, entonces de nuevo uno y el mismo número de señales de dos cómo hacerlo? Esta vez necesitamos saber la cantidad de señal fiable y la señal no es fiable distinguir esta situación.

  • señal no fiable: Si el conjunto actual de señales pendientes especifica señal de que se ha registrado, entonces no hacer nada. Que al mismo tiempo sólo un nodo

  • señal fiable: independientemente de la señal de corriente se ha registrado, se destinará a modificar mapa de bits, añadir un nuevo nodo sigqueue.

    Por un poco bajo el sencillo de castaño de entender: Si tenemos un elemento que debe poner en el armario, para la señal no fiable, dijo que el gabinete habría ahorrado artículos, por lo que no entren y artículos puestos. Para una señal confiable, no importa no hay elementos, tengo que poner en, entonces el indicador se establece en 1.

En quinto lugar, la señal de cancelación

信号的注销其实就是删除当前信号的一个sigqueue节点,并且修改位图

Esa señal para la señal fiable y poco fiable, los mismos dos maneras.

  • señal no fiable: Después de eliminar el nodo, de particular el mapa de bits se establece en 0
  • señal fiable: Después de eliminar el nodo, el nodo determina si existe el mismo, si no, el bit se pone a 0 en la figura.

En sexto lugar, el procesamiento de la señal

El procesamiento de señales, también conocido como la entrega de señales que hemos recibido la señal.
Manejo de señales de tres modos: el modo por defecto de procesamiento, haciendo caso omiso del tratamiento, de dirección de encargo
vista con un comando de señal de hombre, nos encontramos con una función de devolución de llamada, seguido de los dos parámetros de funciones de la señal:
Aquí Insertar imagen Descripción
la señal (int Signum, sighandler_t handler)
el primer argumento: lo que dijimos antes de que el número de señal 1-64
segundo argumento: la función de devolución de llamada se han definido dos parámetros: SIG_IGN: modificará la forma en que la señal se ignora el procesamiento, SIG_DFL: vamos a modificar la forma en que el método por defecto.
Y esta función de devolución de llamada se puede ver en la segunda fila no se define valores de retorno, pero hay una int argumento de la función de devolución de llamada. función de señal de solicitud a continuación demuestra lo

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>

int main()
{
        signal(2,SIG_IGN);
        while(1)
        {
        printf("----------\n");
        sleep(10);
        }
        return 0;
}

Echemos un vistazo a los resultados de captura de pantalla:
Aquí Insertar imagen Descripción
se puede ver está compilado con éxito, pero presiona la tecla Ctrl + C y no dejar de correr, porque es allí donde el segundo argumento SIG_IGN nuestra señal es una función de ignorar el procesamiento de señales No. 2 manera. Eso no va a mantener pulsado Ctrl + cj su papel, y con el fin de carrera de parada puede mantener pulsado Ctrl + \
Ahora definimos el sigcb función de devolución de llamada, de manera que cualquier señal de la llegada de una señal de señal II y III se disparará el sigcb función de devolución de
Aquí Insertar imagen Descripción
mirada vistazo a los resultados:
Aquí Insertar imagen Descripción
explicar los resultados operativos cuando CTRL + C, el sistema recibe una señal Nº 2, ctrl + \ vec recibir una señal Nº 3. He aquí una pregunta que, obviamente, empezamos a dormir, por eso Ctrl + C o Ctrl + \ hora se imprimen inmediatamente, "------"? Esto se debe a que la señal se interrumpe la operación actual, ejecutado cuando el evento terminó, y la ejecución continuará a volver a dormir.
Modificar la forma en que las señales, aquí la función sigaction en un más alto, esta interfaz es introducir nuestro enfoque, la señal Esta interfaz también utilizar nuestra implementación de la interfaz sigaction. Consulte con la página del manual:
Aquí Insertar imagen Descripción

  • El primer parámetro: señal ID signum

  • El segundo argumento: sigaction struct * acto representa una nueva señal de movimiento, es una estructura que puede estar aquí y ver lo que esta estructura que contiene

struct sigaction 
{
	void (*sa_handler)(int);//类似于调用signal函数
	void (*sa_sigaction)(int, siginfo_t *, void *);//信号捕获函数,可以获取其他信息
	sigset_t sa_mask;//执行信号捕获函数期间要屏蔽的其他信号集合
	int sa_flags;//影响信号行为的特殊标志
	void (*sa_restorer)(void);//没有使用,作为了解
}
  • El tercer argumento: la señal * oldact utilizado para obtener la acción original de la señal signum. (De hecho, copia de seguridad)
    en el código original, basado en una ligera mejora, de mirada a la aplicación de esta función
int main()  
{          
        signal(2,sigcb);
//      signal(3,sigcb);
        struct sigaction newact;
        struct sigaction oldact;
        newact.sa_handler=sigcb;    //设置自定义回调函数
        newact.sa_flags=0;     //默认使用sa_handler回调函数
        sigemptyset(&newact.sa_mask);  //清空临时要阻塞的信号集合
        sigaction(2,&newact,&oldact);
        while(1)
        { 
        printf("----------\n");
        sleep(10);
        }
}

De hecho, corremos el mismo efecto con el efecto de la última ejecución.

resumen

Estos son los conceptos sobre señales escritor es tratada de acuerdo a la destrucción y la señal generada flujo de señal al comienzo de la señal de registro de señales para ilustrar, y posiblemente otros bloggers proceso de escritura será más sofisticado que mi división, esperanza lectores dan sugerencias, señalando el error, debemos adoptar una actitud abierta y el progreso común.
Lo siguiente es una señal de definición de procesos de auto-captura, muchas expectativas.

Publicado 33 artículos originales · alabanza ganado 13 · vistas 1063

Supongo que te gusta

Origin blog.csdn.net/Vicky_Cr/article/details/103285170
Recomendado
Clasificación