Saltar al contenido

¿Qué es una llamada al sistema interrumpida?

Hola usuario de nuestra página web, encontramos la respuesta a lo que buscabas, desplázate y la encontrarás aquí.

Solución:

La interrupción de una llamada al sistema por parte de un controlador de señales ocurre solo en el caso de varias llamadas al sistema de bloqueo, y ocurre cuando la llamada al sistema es interrumpida por un controlador de señales establecido explícitamente por el programador.

Además, en el caso de que un controlador de señal interrumpa una llamada al sistema de bloqueo, el reinicio automático de la llamada al sistema es una Opcional rasgo. Usted elige reiniciar automáticamente las llamadas al sistema especificando el SA_RESTART indicador al establecer el controlador de señal. Como se indica en (por ejemplo) la página del manual de la señal de Linux (7):

   If  a  signal  handler  is  invoked while a system call or library
   function call is blocked, then either:

   * the call is automatically restarted  after  the  signal  handler
     returns; or

   * the call fails with the error EINTR.

   Which  of  these two behaviors occurs depends on the interface and
   whether or not  the  signal  handler  was  established  using  the
   SA_RESTART  flag (see sigaction(2)). 

Como se insinúa en la última oración citada anteriormente, incluso cuando elige usar esta función, no funciona para todas las llamadas al sistema, y ​​el conjunto de llamadas al sistema para las que funciona varía según las implementaciones de UNIX. el linux signal(7) página del manual señala una serie de llamadas al sistema que se reinician automáticamente cuando se utiliza el SA_RESTART flag, pero también señala varias llamadas al sistema que nunca se reinician, incluso si especifica ese indicador al establecer un controlador, que incluyen:

   * "Input" socket interfaces, when a timeout (SO_RCVTIMEO) has been
     set  on  the  socket  using  setsockopt(2):  accept(2), recv(2),
     recvfrom(2), recvmmsg(2) (also with  a  non-NULL  timeout  argu‐
     ment), and recvmsg(2).

   * "Output"  socket  interfaces,  when  a timeout (SO_RCVTIMEO) has
     been set on the socket using setsockopt(2): connect(2), send(2),
     sendto(2), and sendmsg(2).

   * File   descriptor   multiplexing   interfaces:    epoll_wait(2),
     epoll_pwait(2), poll(2), ppoll(2), select(2), and pselect(2).

   * System  V  IPC  interfaces:  msgrcv(2), msgsnd(2), semop(2), and
     semtimedop(2).

Para estas llamadas al sistema, es esencial el reinicio manual mediante un bucle del tipo descrito en APUE, algo así como:

while ((ret = some_syscall(...)) == -1 && errno == EINTR)
    continue;
if (ret == -1)
    /* Handle error */ ;

[I haven’t read that APUE thing but the stuff you’re quoting doesn’t look too good]

si mi programa usa una llamada al sistema, sería interrumpido/detenido, si en algún momento el programa capta una señal.

No cualquier llamada al sistema. Solamente algunos las llamadas al sistema son interrumpibles.

(¿El controlador predeterminado también cuenta como captura?)

No.

Por ejemplo, si tengo una llamada al sistema de lectura, que lee 10 GB de datos, cuando está leyendo, envío cualquiera de las señales (por ejemplo, matar -SIGUSR1 pid), luego la lectura fallaría y regresaría.

Su lectura() de 10 GB solo regresará con EINTR si se interrumpió antes de poder leer incluso un solo byte; de lo contrario, devolverá la cantidad de datos que ya había leído (lectura corta = éxito, errno no relevante).

[this was not explained in the linked dupe]

Entonces, si mi comprensión es correcta, ¿qué / por qué debería preocuparme por la llamada al sistema interrumpida ahora …? Parece que el sistema/SO lo maneja automáticamente.

Porque es posible que desee hacer algo al recibir una señal, y no puede hacer mucho desde un controlador de señal; cualquier cosa que use malloc() o stdio (incluso printf()) está fuera de discusión. Por lo tanto, debe manejar las interrupciones en el ciclo principal del programa, y ​​para poder hacerlo, debe romper de alguna manera con una lectura de bloqueo () (una lectura () puede bloquear incluso después de que una encuesta () haya devuelto un fd como listo para leer).

[this was also explained in the linked dupe]

Te mostramos las comentarios y valoraciones de los lectores

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *