Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

372
Visualizações
Supervisar si un proceso ha terminado en C

Introducción

Estoy escribiendo un programa de monitoreo en C, que realiza el ciclo fork() y exec() . Sin embargo, necesito verificar si el proceso secundario ha terminado o no sin bloquear el proceso principal, es decir, el programa de monitoreo. Algo como esto:

Proceso principal

 pid_t child_pid = fork(); if (child_pid == 0) exec(bar); while (1) { if (the child process has finished) foo(); else bar(); }

lo que he probado

Teniendo en cuenta el hecho de que tengo el pid del niño, he intentado lo siguiente:

  • Enviando una llamada de kill con signal 0 y examinando errno :

    if (kill(child_pid, 0) == -1 || errno == ESRCH) , que creo que no es una buena manera de rastrear el estado del proceso secundario, dado que no está a salvo de las condiciones de carrera. Además no funcionó o al menos eso parecía.

  • Inspeccionar con stat(2) si existe proc/child_pid . Todos los argumentos negativos anteriores también son ciertos en este caso, además de que este método es más lento.

  • waitpid(2) . Lamentablemente bloquea el proceso principal.

La pregunta

¿Hay alguna otra forma de obtener este tipo de información? ¿O tal vez me estoy perdiendo algo de las soluciones que ya probé?

over 4 years ago · Santiago Trujillo
3 Respostas
Responde à pergunta

0

Si pasa WNOHANG a waitpid , no debería bloquearse.

 if(waitpid(child_pid, &status, WNOHANG) != 0) { // child process has finished foo(); } else { // child process still running bar(); }
over 4 years ago · Santiago Trujillo Relatório

0

Cuando un proceso está terminando, puede configurar el proceso principal para obtener y manejar una señal SIGCHLD , consulte la señal (7) ; el controlador de señal solo puede llamar a funciones seguras de señal asíncrona, o establecer un indicador volatile sigatomic_t probado fuera del controlador (por ejemplo, en su bucle de evento principal alrededor de poll (2) ...), o escribir (2) en algún descriptor de archivo (por ejemplo, una tubería o algún eventfd(2) ). Como respondió Bruce Ediger , también puede usar el signalfd específico de Linux.

Luego puede usar alguna función de espera, por ejemplo, waitpid (2) (quizás con WNOHANG si no desea bloquear) o wait4 (2) para esperar el proceso y obtener su estado, etc.

Lea también Programación avanzada de Linux para obtener más información. Tiene varios capítulos sobre estas cuestiones.

over 4 years ago · Santiago Trujillo Relatório

0

Si desea que su proceso no se bloquee, o tal vez tenga otros descriptores de archivos para verificar, debe considerar la llamada al sistema signalfd() si está escribiendo para Linux.

Esta llamada al sistema devuelve un descriptor de archivo especial que puede usar en las llamadas al sistema select() , poll() y epoll() . Configurado correctamente, la salida de un proceso secundario hace que el núcleo haga legible el descriptor de archivo especial. La lectura del descriptor de archivo especial le brinda una estructura completa con información sobre el estado de salida del proceso secundario.

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda