Implementación de la función Linux-MySleep y condición de carrera

  
(1) El marco general de la implementación de la función
1> La interfaz de la función 2 necesitaba ser utilizada> La idea general del proceso de la implementación 3> El programa ejecuta el posible análisis de la situación 4> Resultados de la optimización Y la solución (b) tres interfaces de funciones principales

De acuerdo con la función de suspensión interna del sistema, al conocer su proceso en ejecución, puede utilizar la función de alarma (), la función de pausa () y la función de sigaction (). Realizado
Parámetros de función y valores de retorno

Sintaxis de la tabla extra de Markdown:
Nombre de función
Parámetro
Valor de retorno
alarm () unsigned int Los segundos devuelven 0 o el tiempo restante después de la pausa de la respuesta de la señal () anula solo el valor de retorno de error sigaction () (int, const struct sigaction * restrict act, struct sigaction * restrict oact) No hay investigación aquí sigaction structure

Struct sigaction {void (* sa_handler) (int); void (sa_sigaction) (int, siginfo_t, void *); sigset_t sa_mask; int sa_flags; void (* sa_restorer) (void);} Los manejadores de señales pueden usar void (sa_handler) (int) o void (* sa_sigaction) (int, siginfo_t, void). La opción que se use dependerá de si el bit SA_SIGINFO está configurado en sa_flags. Si está configurado, use void (* sa_sigaction) (int, siginfo_t, void *). En este caso, puede enviar información adicional al controlador; de forma predeterminada, void (* sa_handler) ) (int), el valor de la señal solo se puede enviar al controlador en este momento. Sa_handler Este parámetro es el mismo que el controlador de parámetros de la señal (), que representa la nueva función de procesamiento de la señal. Para otros significados, consulte la señal (). Sa_mask se usa para establecer el conjunto de señales especificado por sa_mask para que se retenga temporalmente mientras se procesa esta señal. Sa_restorer Este parámetro no se utiliza. Sa_flags se utiliza para configurar otras operaciones relacionadas con el procesamiento de señales. Los siguientes valores están disponibles. Sa_flags también puede establecer otros indicadores: SA_RESETHAND: cuando se llama al manejador de señal, restablece el manejador de señal al valor predeterminado SIG_DFL SA_RESTART: si la señal interrumpe una llamada del proceso del sistema, el sistema inicia automáticamente la llamada del sistema SA_NODEFER: En general, el kernel bloqueará la señal dada cuando el manejador de señales se esté ejecutando. Sin embargo, si se establece el indicador SA_NODEFER, el kernel no bloqueará la señal cuando el controlador de señales se esté ejecutando.
mysleep código de implementación
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 # include < stdio.h > # include < signal.h > vohand myhandler (int sig) {} int mysleep (int timeout) {struct sigaction act, oact; act .sa_handler = myhandler; sigemptyset (&act.sa_mask); Act.sa_flags = 0; sigaction (SIGALRM, &act, &oact); alarm (timeout); pause (); int ret = alarm (0); sigaction (SIGALRM, &oact, NULL); return ret; } int main () {while (1) {printf (" mysleep start ... \\ n "); mysleep (3); printf (" mysleep success \\ n ");} return 0;} < /señal .h > < /stdio.h> Procedimiento de ejecución

1) La función principal llama a la función mysleep. La función mysleep llama a sigaction para registrar la función handler myhandler para la señal SIGALRM. La función myhandler aquí no hace nada, pero no puede ser menor, porque el procesamiento predeterminado de la señal SIGALRM es terminar el proceso. 2) Llame a la alarma (timeout) para programar la alarma. 3) Llamada en pausa para esperar, el kernel cambia a otro proceso. 4) Después de un tiempo de espera, la alarma expira y el kernel envía SIGALRM al proceso. 5) Antes de que el estado del proceso devuelva el estado de usuario del proceso, la señal pendiente se procesa, se encuentra la señal SIGALRM y la función de procesamiento es myhandler. 6) Luego cambie al modo usuario para ejecutar la función myhandler. Al ingresar a la función myhandler, la señal SIGALRM se enmascara automáticamente. Al regresar de la función myhandler, la señal SIGALRM se desenmascara automáticamente. Luego, automáticamente ejecuta la llamada al sistema sigreturn para volver a ingresar al kernel, y luego regresa al flujo de control principal del estado del usuario para continuar el proceso de ejecución, es decir, la función principal llama a la función mysleep.

Copyright © Conocimiento de Windows All Rights Reserved