Stack Overflow en español Asked by Tomas Hidalgo on February 18, 2021
pues mi problema es que no muestra por pantalla lo siguiente: Padre->hijo 1->Hijo del hijo 1->Hijo del hijo 2… Esa seria mas o menos una explicación un tanto rara,pero creo que se entiende lo que busco en mi programa. Si alguno puede ayudarme,ya que llevo horas quebrándome la cabeza y nada.
Aquí les dejo mis avances,pueden compilarlo y ejecutarlo para que vean que ocurre.
//Crear procesos hasta N,donde cada hijo es el padre del siguiente hijo
#include <stdio.h>//Printf y scanf
#include <stdlib.h>//Exit
#include <sys/wait.h>//Wait
#include <unistd.h>//pid_t,getpid,getppid
#include <errno.h>//Errno
#include <sys/types.h>//fork
int main(int argc,char **argv){
int status,n;
pid_t pid,pidd;
if(argc!=2){
if(argc>2){
printf("Demasiados argumentosn");
exit(EXIT_FAILURE);
}
else{
printf("Pocos argumentosn");
exit(EXIT_FAILURE);
}
}
n=atoi(argv[1]);
for(int i=0;i<n;i++){
pid=fork();
switch(pid){
case 0://Caso hijo
printf("Soy el hijo %i y mi ID es %i y el de mi padre es %in",i+1,getpid(),getppid());
exit(EXIT_SUCCESS);
case -1://Caso error
perror("Error forkn");
printf("Errno = %in",errno);
exit(EXIT_FAILURE);
}
pidd=wait(&status);
if(pidd>0){
if(WIFEXITED(status)){
printf("Hijo %i es exitoso y su status %in",pidd,WEXITSTATUS(status));
}
else if(WIFSIGNALED(status)){
printf("Hijo %i ha muerto y su status es %in",pidd,WTERMSIG(status));
}
else if(WIFSTOPPED(status)){
printf("Hijo %i ha parado y su status es %in",pidd,WSTOPSIG(status));
}
}
else{
printf("Error en el waitn");
exit(EXIT_FAILURE);
}
}
exit(EXIT_SUCCESS);
}
Tu problema es muy simple: el for( )
lo está ejecutando solo el proceso inicial; los hijos simplemente terminan con exit(EXIT_SUCCESS);
:
for(int i=0;i<n;i++){
pid=fork();
switch(pid){
case 0://Caso hijo
exit(EXIT_SUCCESS);
Por lo tanto, que cada vez que haces un fork( )
estás partiendo del mismo proceso (el padre), así que solo estás creando hijos de un mismo padre.
Una posible solución es sustituir el for( )
por un while( )
, y utilizar una variable adicional para llevar la cuenta:
#include <stdio.h>//Printf y scanf
#include <stdlib.h>//Exit
#include <sys/wait.h>//Wait
#include <unistd.h>//pid_t,getpid,getppid
#include <errno.h>//Errno
#include <sys/types.h>//fork
int main(int argc,char **argv){
int status,n;
pid_t pid,pidd;
if(argc!=2){
if(argc>2){
printf("Demasiados argumentosn");
exit(EXIT_FAILURE);
}
else{
printf("Pocos argumentosn");
exit(EXIT_FAILURE);
}
}
n=atoi(argv[1]);
int i = 1;
while( i < n ) {
pid=fork();
switch(pid){
case 0://Caso hijo
printf("Soy el hijo %i y mi ID es %i y el de mi padre es %in",i,getpid(),getppid());
++i;
continue;
case -1://Caso error
perror("Error forkn");
printf("Errno = %in",errno);
exit(EXIT_FAILURE);
default:
i = n;
}
pidd=wait(&status);
if(pidd>0){
if(WIFEXITED(status)){
printf("Hijo %i es exitoso y su status %in",pidd,WEXITSTATUS(status));
}
else if(WIFSIGNALED(status)){
printf("Hijo %i ha muerto y su status es %in",pidd,WTERMSIG(status));
}
else if(WIFSTOPPED(status)){
printf("Hijo %i ha parado y su status es %in",pidd,WSTOPSIG(status));
}
}
else{
printf("Error en el waitn");
exit(EXIT_FAILURE);
}
}
exit(EXIT_SUCCESS);
}
Soy el hijo 1 y mi ID es 32128 y el de mi padre es 32127
Soy el hijo 2 y mi ID es 32129 y el de mi padre es 32128
Soy el hijo 3 y mi ID es 32130 y el de mi padre es 32129
Hijo 32130 es exitoso y su status 0
Hijo 32129 es exitoso y su status 0
Hijo 32128 es exitoso y su status 0
Ahora, los hijos toman parte activa del proceso, creando a su vez otros hijos, y terminando cuando los han creado.
Correct answer by Trauma on February 18, 2021
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP