Pregunta

Trabajo en código algo como esto

... HEADERS ...

int *var;

void child() {
  ... //some work
  free(var);
  exit(EXIT_SUCCESSFUL);
}

int main(void) {
  ...
  //allocate variable
  var = (int *) malloc(N*sizeof(int));
  ... //work with var

  for(int i; i<PROC_COUNT; i++) {
    pid_t child = fork();
    if(pid == 0) {
      child(); //main function of new proces
      break;
    }
    elseif(pid < 0) {
      //there is enormous problem -> kill every proces
      kill(0, SIGTERM);
      waitpid(0, NULL, 0); //wait for children
      free(var);
      exit(EXIT_FAILURE);
    }

  }
  free(var);
  return EXIT_SUCCESS;
}

Cuando el proceso se bifurca, todas las variables también se clonan. En caso regular se liberan todas las copias de var.

Si hay un error en fork () , envío la señal SIGTERM a todos los procesos creados. Y necesito escribir el manejador de señales para SIGTERM, que libera var y termina la aplicación. Sin embargo, free () no es la función segura de señal , así que no debería llamarlo. ¿Pero cómo liberar () esa variable?

Muchas gracias por sus respuestas ...

EDITAR: valgrind también muestra una variable accesible:

==5928== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 15 from 1)
==5928== malloc/free: in use at exit: 20 bytes in 1 blocks.
==5928== malloc/free: 1 allocs, 0 frees, 20 bytes allocated.
==5928== For counts of detected errors, rerun with: -v
==5928== searching for pointers to 1 not-freed blocks.
==5928== checked 49,164 bytes.
¿Fue útil?

Solución

Dudo que lo necesites. Cualquier sistema operativo que admita fork () también liberará automáticamente asignaciones de malloc () cuando finalice un proceso, independientemente de cómo lo haga (incluida la terminación).

Existen entornos en los que los programas de C no se ejecutan en los procesos y hay que tener mucho cuidado con lo que se deja en la salida. Pero esos entornos no son POSIX, y no soportarán fork (). Es posible que no admitan señales, para el caso. Si está escribiendo para un entorno tan inusual, verifique su documentación ...

Si desea ver un informe de valgrind limpio, puede hacer que el manejador pegue un evento en el bucle de eventos del niño (o establezca una bandera y publique un semáforo, o lo que sea), y procese el evento como una salida limpia. Eso es lo que harías si tu programa fuera una aplicación interactiva y quisieras guardar los datos del usuario en un SIGTERM, suponiendo que tu marco de IU no haya traducido SIGTERM en un evento para ti.

Otros consejos

Puede que esté malinterpretando algo, pero seguramente después de SIGTERM todo el proceso desaparecerá, ¿se llevará su variable?

Puede usar exec para iniciar el proceso hijo desde main en lugar de llamar directamente a la función child (). Use un argumento de línea de comando para notificar al programa hijo que haga el trabajo principal. Entonces el proceso hijo podrá limpiarse correctamente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top