Foros aprenderaprogramar.com
Aprender a programar => C, C++, C#, Java, Visual Basic, HTML, PHP, CSS, Javascript, Ajax, Joomla, MySql y más => Mensaje iniciado por: gatoher en 19 de Diciembre 2016, 20:50
-
Pues me gustaría saber si alguien me puede explicar una parte de un método que no llego a entender. La verdad que en C no estoy muy puesto. Mejor comento lo que comprendo y me explicais la parte que tengo en duda. Pongo el método:
//HIJOS PARALELOS
void ejemplo2(){
NUM_HIJOS = 3; // ejemplo
int ret, i;
for (i=0; i<NUM_HIJOS; i++) {
ret = fork(); //Aqui generamos un nuevo proceso
if (ret == 0) {
/* estamos en alguno de los hijos. */
printf("Yo soy el hijo %d, mi padre es PID= %d, yo soy PID= %d\n", i,getppid(), getpid());
//Este exit solo acaba el proceso en ejecución
//ya que el bucle si hace 3 ciclos
exit(EXIT_SUCCESS);
//Solo si hay un error al crear el proceso
} else if (ret == -1) {
perror("fallo en fork");
exit(EXIT_FAILURE);
}
//fin for
}
//aqui llega despues de crear el proceso hijo por la linea de antes de
//exit(EXIT_SUCCESS);
ret = wait(NULL); // ¿¿¿ ret vale -1 ????
//A partir de aqui no lo entiendo
//A mi forma de ver aqui nunca entraría
while (ret > 0) {
ret = wait(NULL);
}
/*Esto tampoco lo entiendo*/
if (ret == -1 && errno != ECHILD) {
perror("fallo en wait");
exit(EXIT_FAILURE);
}
}
No se si me expliado, la verdad.
-
Buenas, la verdad es que esto corresponde a programación bastante avanzada (que no se suele usar excepto para cuestiones singulares)
Aquí hay un ejemplo que quizás ayude a entender fork y wait aunque solo lo recomiendo para expertos:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
int main(void)
{
pid_t child_pid, wpid;
int status = 0;
int i;
int a[3] = {1, 2, 1};
printf("parent_pid = %d\n", getpid());
for (i = 0; i < 3; i++)
{
printf("i = %d\n", i);
if ((child_pid = fork()) == 0)
{
printf("In child process (pid = %d)\n", getpid());
if (a[i] < 2)
{
printf("Should be accept\n");
exit(1);
}
else
{
printf("Should be reject\n");
exit(0);
}
/*NOTREACHED*/
}
}
while ((wpid = wait(&status)) > 0)
{
printf("Exit status of %d was %d (%s)\n", (int)wpid, status,
(status > 0) ? "accept" : "reject");
}
return 0;
}
Ejemplo de posible resultado:
parent_pid = 15820
i = 0
i = 1
In child process (pid = 15821)
Should be accept
i = 2
In child process (pid = 15822)
Should be reject
In child process (pid = 15823)
Should be accept
Exit status of 15823 was 256 (accept)
Exit status of 15822 was 0 (reject)
Exit status of 15821 was 256 (accept)
Salu2