¿Cómo cambiar el manejador de señales en proceso hijo?

rudi8848

Estoy escribiendo un shell con control de trabajo. El proceso principal debe ignorar las señales de parada y manejar SIGCHLD. El proceso hijo después de fork () debería establecer las señales en SIG_DFL. El problema es que el proceso de mi hijo también ignora las señales.

Al comienzo de mi programa, configuro el shell en primer plano e inicializo las señales

...
tcsetpgrp(shell_terminal, shell_pgid);
set_signals();

void    chld_handler(int signum)
{
    if (signum == SIGCHLD)
        check_and_wait();
    return ;
}

void    set_signals() {
    sigset_t set;
    struct sigaction act;

    sigfillset(&set);
    sigprocmask(SIG_SETMASK, &set, NULL);

    ft_memset(&act, 0, sizeof(act));

    sigfillset(&act.sa_mask);
    act.sa_handler = SIG_IGN;

    sigaction(SIGINT, &act, NULL);
    sigaction(SIGQUIT, &act, NULL);
    sigaction(SIGTSTP, &act, NULL);
    sigaction(SIGTERM, &act, NULL);
    sigaction(SIGTTIN, &act, NULL);
    sigaction(SIGTTOU, &act, NULL);

    act.sa_handler = chld_handler;

    sigaction(SIGCHLD, &act, NULL);

    sigemptyset(&set);
    sigprocmask(SIG_SETMASK, &set, NULL);
    return;
}

después de fork () en proceso hijo:

/* set to foreground */
pid = getpid();
if (!job->pgid)
    job->pgid = pid;
setpgid(pid, job->pgid);
tcsetpgrp(shell_terminal, job->pgid);

/* set signals */
sigset_t set;
struct sigaction act;

sigfillset(&set);
sigprocmask(SIG_SETMASK, &set, NULL);

memset(&act, 0, sizeof(act));
sigfillset(&act.sa_mask);

act.sa_handler = SIG_DFL;

sigemptyset(&set);
sigprocmask(SIG_SETMASK, &set, NULL);

execve(...);

Pero el proceso hijo ignora las señales

PSkocik

sigaction()no almacena el objeto sigaction por referencia. Después de cambiar act.sa_handlera act.sa_handler = SIG_DFL, debe repetir esas sigaction()llamadas.

sigaction(SIGINT, &act, NULL);
sigaction(SIGQUIT, &act, NULL);
sigaction(SIGTSTP, &act, NULL);
sigaction(SIGTERM, &act, NULL);
sigaction(SIGTTIN, &act, NULL);
sigaction(SIGTTOU, &act, NULL);

Este artículo se recopila de Internet, indique la fuente cuando se vuelva a imprimir.

En caso de infracción, por favor [email protected] Eliminar

Editado en
0

Déjame decir algunas palabras

0Comentarios
Iniciar sesiónRevisión de participación posterior

Artículos relacionados

¿Cómo cambiar el manejador de señales en proceso hijo?

el manejador de señal de sigaction no se llama en el proceso hijo

¿Cómo determinar si el código se está ejecutando en el contexto del manejador de señales?

Cambiar el directorio de trabajo actual en el proceso hijo en C

El manejador de señales SIGTERM no imprime en una consola

Usar señales en un proceso hijo

No se encontró el manejador de señales

Cómo cerrar correctamente un archivo con el manejador de señales

¿En qué situaciones se puede ejecutar un manejador de señales en el subproceso no principal?

Asignación de señales en el proceso VHDL

¿Cómo hacer que el pid de algún proceso se inicie dentro del proceso hijo con ayuda si la familia ejecutiva en C / C ++ en Linux?

¿Por qué el manejador de señales no funciona cuando agregué otro hilo de bloqueo en Go?

El manejador de señales QML no responde a la señal C ++

¿Cómo asegurarse de que el manejador de señales haya terminado y solo luego continúe el programa?

Cambiar la señal de terminación del proceso hijo en tiempo de ejecución

¿Cómo pasar mensajes y stdout de hijo a padre en el módulo de proceso hijo de node.js?

Ignorar señales en el proceso padre

Ignorar señales en el proceso padre

Llamar a SysV msgsnd desde el manejador de señales

printf interbloqueo: algunos mensajes de printf se ignoran si se usa printf en el manejador de señales

¿Cómo matar solo el proceso hijo en primer plano?

La señal POSIX está bloqueada en el manejador de señales a pesar de no estar en sa_mask

¿Cómo hacer un manejador de señales para SIGCHLD que cosechará procesos en segundo plano en shell?

Caminando un TAILQ en un manejador de señales

¿Cómo se devuelve fork () para el proceso hijo?

Cómo esperar correctamente a que se complete el proceso secundario de bash al atrapar señales

Manejador de señales SIGKILL

¿Cómo manejar las señales cuando el proceso está esperando en waitpid?

En el multiprocesamiento de Python, cuando el proceso hijo escribe datos en la cola y nadie los lee, el proceso hijo no se cierra. POR QUÉ

TOP Lista

  1. 1

    ¿Cómo ocultar la aplicación web de los robots de búsqueda? (ASP.NET)

  2. 2

    Pandas의 CSV 파일을 Pandas 데이터 프레임으로 가져 오기

  3. 3

    uitableview delete button image in iOS

  4. 4

    Manera correcta de agregar referencias al proyecto C # de modo que sean compatibles con el control de versiones

  5. 5

    Swift / Firebase : Facebook 사용자가 계정을 만들 때 Firebase 데이터베이스에 제대로 저장하려면 어떻게해야합니까?

  6. 6

    caída condicional de filas desde un marco de datos de pandas

  7. 7

    Link library in Visual Studio, why two different ways?

  8. 8

    Pagination class not getting applied in html

  9. 9

    Que signifie Decimal (-1)?

  10. 10

    UIButton textLabel with different fonts

  11. 11

    WPF pleine largeur DataGridColumn sur la largeur de DataGrid

  12. 12

    Opción de máquina virtual no reconocida 'MaxPermSize = 512m' cuando se ejecuta Zeppelin

  13. 13

    matplotlib로 그래프를 그리는 동안 커서 위치에서 날짜 / 시간을 볼 수 없습니다. "DateFormatter에서 x = 0 값을 찾았습니다"라는 오류가 발생합니다.

  14. 14

    ¿Es posible en Windows evitar que otras aplicaciones se enganchen en las DLL del sistema?

  15. 15

    Error de la base de datos de Android Firebase: Permiso denegado al depurar en un teléfono

  16. 16

    Pandas: suma filas de DataFrame para columnas dadas

  17. 17

    ggplot2: gráfico con líneas y puntos para problemas de leyenda de dos conjuntos de datos

  18. 18

    ¿Cómo especificar el puerto en el que se aloja una aplicación ASP.NET Core?

  19. 19

    Recherche de la position d'index d'une valeur dans r dataframe

  20. 20

    GPU를 사용하여 ffmpeg 필터의 처리 속도를 가속화하는 방법은 무엇입니까?

  21. 21

    nested observables executed one after the other after termination

CalienteEtiquetas

Archivo