Funciones de la biblioteca C -sigpending()
sigpendingEs una función de la biblioteca estándar de C utilizada para obtener el conjunto de señales pendientes del proceso actual. Las señales pendientes son señales que se han enviado pero aún no se han procesado después de ser bloqueadas. Esta función se define en<signal.h>el archivo de cabecera.
Sintaxis
int sigpending(sigset_t *set);
Parámetros
sigset_t *setapunta a unsigset_tvariable de tipo, que se rellenará con el conjunto de señales pendientes del proceso actual.
Valor de retorno
- Devuelve 0 en caso de éxito.
- Devuelve -1 en caso de error y establece
errnopara indicar el tipo de error.
Ejemplo
A continuación se muestra un uso de lasigpendingfunción para obtener el conjunto de señales pendientes del proceso actual. El programa bloqueaSIGINTseñal, luego envía esa señal y usasigpendingpara verificar si la señal está en el conjunto de señales pendientes.
Ejemplo
#include <signal.h>
#include <unistd.h>
void handle_sigint(int sig) {
printf("Caught signal %d\n", sig);
}
int main() {
sigset_t new_mask, old_mask, pending;
// Configurar el manejador de SIGINT
signal(SIGINT, handle_sigint);
// Inicializar el conjunto de señales y bloquear la señal SIGINT
sigemptyset(&new_mask);
sigaddset(&new_mask, SIGINT);
if (sigprocmask(SIG_BLOCK, &new_mask, &old_mask) == -1) {
perror("sigprocmask");
return 1;
}
// Enviar la señal SIGINT
raise(SIGINT);
// Obtener el conjunto de señales pendientes
if (sigpending(&pending) == -1) {
perror("sigpending");
return 1;
}
// Verificar si SIGINT está en el conjunto de señales pendientes
if (sigismember(&pending, SIGINT)) {
printf("SIGINT is pending\n");
} else {
printf("SIGINT is not pending\n");
}
// Restaurar la máscara de señales original
if (sigprocmask(SIG_SETMASK, &old_mask, NULL) == -1) {
perror("sigprocmask");
return 1;
}
return 0;
}
Después de compilar y ejecutar el programa, la salida será:
SIGINT is pending Caught signal 2
El programa primero bloqueaSIGINTla señal, luego envía esa señal y usasigpendingpara verificarSIGINTsi está en el conjunto de señales pendientes. Finalmente, el programa restaura la máscara de señales original y captura laSIGINTseñal, ejecuta el manejador de señales.
Análisis
sigset_t new_mask, old_mask, pending;: Define tres conjuntos de señales para controlar el enmascaramiento de señales y almacenar el conjunto de señales pendientes.- Usa
sigprocmaskla función para bloquearSIGINTla señal y guarda la máscara de señales original. - Usa
raisela función para enviarSIGINTla señal. - Usa
sigpendingla función para obtener el conjunto de señales pendientes y verificaSIGINTsi está en el conjunto de señales pendientes. - Usa
sigprocmaskla función para restaurar la máscara de señales original.
Notas
sigpendingLa función obtiene el conjunto de señales pendientes del proceso actual, incluidas todas las señales que se han enviado pero aún no se han procesado.- La función de manejo de señales debe ser lo más breve posible, ya que se bloquean otras señales durante el procesamiento de una señal. Una función de manejo de señales de larga duración puede afectar el tiempo real del programa.
Biblioteca estándar de C - <signal.h>