Pregunta

Estoy intentando crear un proceso hijo en otro proceso. Estoy escribiendo tanto los programas en lenguaje C. Primero escribo un proceso simulado que será el proceso hijo. Lo que está haciendo es sólo para escribir una cadena en la pantalla. Funciona bien en sí mismo. Entonces escribo otro programa que será el proceso padre. Sin embargo, no puedo hacer que suceda. Estoy tratando de usar el tenedor y funciones Execl juntos, pero fallar. También quiero que el proceso hijo no termina hasta que los padres por concluido el proceso.

¿Cómo debo escribir el proceso padre?

Gracias.

Este es el código para el proceso hijo:

#include <stdio.h>

int main(void) {
  while(1) {
    printf("*");
    sleep(1);
  }
}

Y aquí es el proceso padre:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(void) {
  if (fork()) {
    while(1) {
      printf("-\n");
      sleep(5);
    }
  } else {
    execl("./", "dummy", (char *)0);
  }
}
¿Fue útil?

Solución

La llamada al sistema tenedor () puede devolver tres estados diferentes: el fracaso (<0), proceso padre (> 0) o proceso hijo (== 0). Debe probar el valor de retorno correctamente.

int pid = fork();

if (pid < 0) {
  /* handle error */
  perror("fork");
  exit(1);
} else if (pid > 0) {
  /* parent code */
} else {
  /* child code */
}
llamada

Su execl () del sistema está mal. El primer argumento es la ruta al programa que desea ejecutar, "./" no es válido, debe ser algo así como "./dummy" por lo menos. El siguiente argumento es, por convención, el nombre del comando (argv [0] en el programa ejecutado), que puede ser una repetición del primer argumento. Por lo tanto:

execl("./dummy", "dummy", NULL);

Además, nota que la declaración printf("*") en el programa de niño probablemente buffer y no verá nada en el terminal. O se debe agregar un "\ n" al final o una llamada fflush(stdout) para enjuagar la salida estándar.

Otros consejos

uso básico de tenedor en C

int PID = fork();

if( PID < 0 ) {
    //fail
    return PID;
}
else if( !PID ) {
    //child process
    return exec( prog, args );
} 
else {
    //parent process
    return 0;
}

No hay manera de forzar a que el proceso hijo "no termina" cuando esté hecho (que todavía será capaz de que el padre wait para que pueda obtener información sobre la forma en que terminó, pero eso es todo). Aparte de eso, cualquiera de los muchos ejemplos de fork / exec en la web, como éste , debería funcionar - ¿por qué no probarlo y ver si funciona como desee (en cuyo caso solo tendrá que cambiar lo que estaba haciendo de manera diferente en su propio intento). Si no funciona como se desea (a excepción de la imposibilidad por la primera frase de este ;-) A, por favor editar su añada copiosa detalles acerca de cómo se comporta el código distinta a la esperada a.

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