TransWikia.com

Procesos en forma de anillo hasta N

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);
}

One Answer

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

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP