Autor Tema: No se como matar los procesos con exit y wait...me podeis ayudar???  (Leído 7507 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado pacorubio77

  • PIC10
  • *
  • Mensajes: 6
Hola,mirar tengo un problema....no se utilizar exit y wait....creo mis procesos ,,,hago lo que me piden en el problema...pero no se como hacer que mueran los procesos con exit y wait...creo que del problema tengo echa la parte más dificil,pero como no se como matar procesos ....

Tengo que hacer lo siguiente

$ arbol 4
Soy el proceso padre (11): mi pid es 8541
Soy el proceso 21: mi pid es 8542. Mis padres son: 8541
Soy el proceso 22: mi pid es 8543. Mis padres son: 8541
Soy el proceso 23: mi pid es 8548. Mis padres son: 8541
Soy el proceso 31: mi pid es 8544. Mis padres son: 8543, 8541
Soy el proceso 41: mi pid es 8545. Mis padres son: 8544, 8543, 8541
Soy el proceso 42: mi pid es 8546. Mis padres son: 8544, 8543, 8541
Soy el proceso 43: mi pid es 8547. Mis padres son: 8544, 8543, 8541
/*Tras un intervalo de n segundos aparecerá */
Soy 41 (8545) y muero
Soy 42 (8546) y muero
Soy 43 (8547) y muero
Soy 31 (8544) y muero
Soy 21 (8542) y muero
Soy 22 (8543) y muero
Soy 23 (8548) y muero
Soy 11 (8541) y muero

Pues la primera parte la hago bien...pero no se como matar los procesos....
Si me ayudais pongo código para que vean que me estoy esforzando....el orden en el que mueran los procesos no es importante...

Si hace falta que ponga código..por favor digánmelo..

Espero ayuda...gracias.

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: No se como matar los procesos con exit y wait...me podeis ayudar???
« Respuesta #1 en: 01 de Marzo de 2009, 18:16:07 »
Hola! Podrias darnos mas informacion? Bajo que OS estas trabajando? Podrias subir el codigo q tenes?

"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein

Desconectado pacorubio77

  • PIC10
  • *
  • Mensajes: 6
Re: No se como matar los procesos con exit y wait...me podeis ayudar???
« Respuesta #2 en: 01 de Marzo de 2009, 18:38:38 »
Hola,tienes mucha razon...el problema es un problema planteado en c++ ,que debe hacer lo que le he puesto en el enunciado...yo tengo echo todo hasta la parte de matar procesos(el orden no imporaria)..el programa lo tengo realizado en C, quiere usted que suba el código ?

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: No se como matar los procesos con exit y wait...me podeis ayudar???
« Respuesta #3 en: 01 de Marzo de 2009, 19:03:53 »
Estaria bueno q subas el codigo asi vemos donde tenes problemas. Ademas me gustaria q me digas en q sistema operativo estas trabajando (linux/unix, win...), ya q el manejo de procesos es muy distinto entre un OS y el otro.
saludos!

"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein

Desconectado pacorubio77

  • PIC10
  • *
  • Mensajes: 6
Re: No se como matar los procesos con exit y wait...me podeis ayudar???
« Respuesta #4 en: 01 de Marzo de 2009, 19:49:22 »
Hola,el sistema operativo es Linux y aqui tienen ustedes el código....un saludo y espero respueta..

Gracias.

Código: [Seleccionar]

//#include<iostream>
//#include<cstring>
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>


//using namespace std;


void Recursiva(int cont,int profundidad,int vpadres[],int n){

int pid;
int i;
int j;
int estado;
//int vpadres[100];
//int n=1;
i=1;
//cont++;
//printf("dentro de recursiva\n");
//printf("contador3 %d\n",cont);
if(cont<=profundidad){

if(cont==2){
printf("soy el padre (%d%d)y mi pid es %d\n",cont-1,i,getpid());
vpadres[0]=getppid();

}
for(i=1;i<=3;i++){
//cout<<"i "<<i<<endl;

vpadres[n]=getpid();
//printf("i %d  %d\n",i,vpadres[i]);

pid = fork();

//vpadres[i]=getppid();
/*
if(pid>0){
//printf("AQUI SE METE??????\n");
printf("soy el padre y mi pid es %d\n",getpid());
}
*/
//printf("N %d\n",n);
if(pid==0){//el padre ha creado un hijo
//printf("soy el hijo %d%d mi pid es %d y el de mi padre es %d \n ",cont,i,getpid(),getppid());


printf("Mi pid es %d y el de mis padres son: ", getpid());
for (j =n; j > 0; j--){
printf("%d ", vpadres[j]);
}
printf("\n");

cont++;
//sleep(5);

//printf("contador %d\n",cont);
if(cont<=profundidad){
if(i==2){
//printf("soy el hijo %d mi pid es %d y el de mi padre es %d \n ",i,getpid(),getppid());
n++;
vpadres[n]=getpid();
pid=fork();
//cont++;
cont++;
if(pid==0){
//printf("soy el hijo %d1 mi pid es %d y el de mi padre es %d\n ",cont-1,getpid(),getppid());

//sleep(5);
printf("Mi pid es %d y el de mis padres son: ", getpid());
for (j =n; j > 0; j--){
printf("%d ", vpadres[j]);
}
printf("\n");

//printf("contador1 %d\n",cont);

n++;
if(cont<=profundidad){
//printf("paso aqui\n");
Recursiva(cont,profundidad,vpadres,n);
}

}
sleep(15);
exit(0);

}
//sleep(5);
exit(0);
}
sleep(20);
exit(0);
}
}
sleep(5);
//exit(0);
for(i=1;i<=3;i++){
//printf("estado %d\n",estado);
wait(&estado);
printf("soy el padre con pid %d y mi hijo %d ha terminado\n",getpid(),getppid());
}

}
//printf("vpadres %d\n",vpadres[0]);
//sleep(2);
//exit(0);
}

int main(int argc,char *argv[]){

int cont=0;
int pid;
//pid = fork();
int i=1;
int j;
int profundidad,estado;
//cout<<pid<<endl;
int pos=0;
int vpadres[100];
int indice;


indice=1;
//printf("el argumento es "<<argv[1]<<endl;
profundidad=atoi(argv[1]);
//profundidad=argv[1]+ 0;
//printf("la profundidad es %d ",profundidad);

cont++;

if(profundidad > 1){
cont++;
Recursiva(cont,profundidad,vpadres,indice);
}
return(0);
}


si no se entienden asi..tambien les adjunto el archivo,espero ayuda..gracias.

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: No se como matar los procesos con exit y wait...me podeis ayudar???
« Respuesta #5 en: 01 de Marzo de 2009, 20:51:34 »
Solamente tenes q hacer q inicien N hijos y luego mueran? Porq en ese caso creo q te estas complicando demasiado. Noto tu codigo un poco desprolijo. Aca te dejo un ejemplito sencillo de manejo de procesos. Cualquier duda q tengas consulta tranquilo.

Código: [Seleccionar]
#include <stdio.h>
#include <unistd.h>

int main (void){
printf ("antes del fork \n");
switch(fork()) {
                case 0: /* hijo */
                        printf("lo q tenga q hacer el hijo\n");
                        exit(0);  //esto finaliza el proceso hijo
                        break;
                case -1: /* error*/
                        perror("fork()");
                        return 1;
default: /* padre */
wait(); //esperamos a los hijos
break;
}
printf("lo q tenga q hacer el padre");
exit(0);
}

Basicamente para finalizar un proceso se usa la funcion exit(); q recibe como parametro el exit status. Si todo salio bien se acostumbra mandar un 0, en caso contrario, se envia un numero negativo indicando q hubo un error. La funcion wait se utiliza para q el padre espere a q sus hijos finalicen, ya q si este no los espera, finaliza matandolos antes de q terminen. La funcion recibe como parametro un puntero, q apunta a la variable donde se va a guardar el exit status del hijo.
En resumen, inicializas todos los hijos, como bien lo has hecho, con un for. Luego al padre lo dejas esperando por ellos con un wait. Y cuando todos los hijos hayan hecho un exit, el programa termina
Saludos!
« Última modificación: 01 de Marzo de 2009, 21:00:47 por gera »

"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein

Desconectado pacorubio77

  • PIC10
  • *
  • Mensajes: 6
Re: No se como matar los procesos con exit y wait...me podeis ayudar???
« Respuesta #6 en: 01 de Marzo de 2009, 21:01:35 »
Hola,tengo que hacer que seguún el parametro por ejemplo 4,cree un arbol de profundidad 4,el archivo adjunto está más organizado. los procesos si usted lo ha ejecutado crea el arbol ,le adjunto tambien un ejemplo en un doc de lo que tiene que salir,los procesos los crea perfectamente, según el enunciado..el problema es que no se acabarlos es decir no se hacer este paso

/*Tras un intervalo de n segundos aparecerá */
Soy 41 (8545) y muero
Soy 42 (8546) y muero
Soy 43 (8547) y muero
Soy 31 (8544) y muero
Soy 21 (8542) y muero
Soy 22 (8543) y muero
Soy 23 (8548) y muero
Soy 11 (8541) y muero

Si usted lo ha ejecutado verá que el problema lo tengo al matar los procesos...no se como utilizar exit ni wait...me entiende?

Adjunto el enunciado para que usted lo entienda mejor.

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: No se como matar los procesos con exit y wait...me podeis ayudar???
« Respuesta #7 en: 01 de Marzo de 2009, 21:13:57 »
Bueno, como te explique, al llamar a la funcion exit() el proceso se "autodestruye" digamos. Y la funcion wait se usa para q el padre no muera sin esperar a sus hijos. Basta con implementarlas donde sea necesario

"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein

Desconectado pacorubio77

  • PIC10
  • *
  • Mensajes: 6
Re: No se como matar los procesos con exit y wait...me podeis ayudar???
« Respuesta #8 en: 01 de Marzo de 2009, 21:29:54 »
entonces si donde creo los hijos como usted ha visto en el código que le he pasado,tengo exit despues de la creacion de hijos,usted me dice que eso se autodestruye y el wait es para que los hijos acaben antes que el padre,me puede decir una forma (ya que autodestruido los hijos), de llamarlos con un cierto orden? igual que le he puesto ,de esta forma:

/*Tras un intervalo de n segundos aparecerá */
Soy 41 (8545) y muero
Soy 42 (8546) y muero
Soy 43 (8547) y muero
Soy 31 (8544) y muero
Soy 21 (8542) y muero
Soy 22 (8543) y muero
Soy 23 (8548) y muero
Soy 11 (8541) y muero

siendo el numero entre parentesis el getpid...verdad?

Espero respuesta.
Gracias.


Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: No se como matar los procesos con exit y wait...me podeis ayudar???
« Respuesta #9 en: 02 de Marzo de 2009, 00:59:30 »
Perdon, pero no entendi la pregunta. Queres q los hijos sean llamados o mueran en orden? Si es asi, hay q implementar tecnicas de comunicacion entre procesos y ya es mas complicado.
saludos!

"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein

Desconectado pacorubio77

  • PIC10
  • *
  • Mensajes: 6
Re: No se como matar los procesos con exit y wait...me podeis ayudar???
« Respuesta #10 en: 02 de Marzo de 2009, 12:22:38 »
Hola..no tienen porque morir en orden..tienen que morir en orden o no daría igual...pero tienen que morir...el orden no tiene importancia..pero tienen que morir...y eso es lo que no se como hacer....

Desconectado alexysar

  • PIC16
  • ***
  • Mensajes: 206
    • e-Kit
Re: No se como matar los procesos con exit y wait...me podeis ayudar???
« Respuesta #11 en: 18 de Junio de 2009, 11:57:11 »
Mira te dejo el siguiente ejemplo sencillo que es la mejor forma de entenderlo:

Código: [Seleccionar]
#include<stdio.h>
#include<signal.h>
#include<sys/wait.h>


void handler_sigchld(int type);


main()
{


printf ("\n ******************** Inicio ****************************\n");
if (fork()){
// en el padre
signal(SIGCHLD,handler_sigchld);                          //setea el handler de señal
printf("\n\n\n Soy el padre de Pid %d ",getpid());
sleep(10);                                                                //espera 10seg porque no tengo nada que hacer
exit(0); //el padre sale

}
    else{
//en el hijo


printf("\n\n soy el hijo de Pid %d",getpid());
sleep(1);                                                                 //espera 1 seg para dar tiempo a que el padre inicie
printf("\n Ahora me suicido\n");
exit(0);                                                                  // El hijo sale
printf("\n El hijo nunca llega aqui porque se suicido\n");
}
}

void handler_sigchld (int type)
{                                                            //Pasa aqui cuando el padre recibe la señal SIGCHLD del hijo
int status_chld;
printf("\nsoy el padre y recibi la señal de muerte de mi hjjo hijo. Salte al  handler de la señal SIGUCHLD\n");

wait(&status_chld);                              // toma el estado de salida del hijo, y liebera recursos
}

La salida es la siguiente:

Código: [Seleccionar]
******************** Inicio ****************************



 soy el hijo de Pid 6515
 Ahora me suicido
 Soy el padre de Pid 6514
soy el padre y recibi la señal de muerte de mi hjjo hijo. Salte al  handler de la señal SIGUCHLD


Explicación:
El proceso padre crea un hijo. El hijo se suicida con exit(0). El 0 es el estado de salide, en este caso 0 indica que termino correctamente, si le pondrías -1 inidicaria que salio con error-
El padre hace un sleep(10), es decir espera 10 seg, pero podria hacer lo que vos quieras.
El hijo hace un sleep(1) para darle tiempo al padre que pase por la llamada signa().
Luego el hijo se suicida exit(0);

Cuano un hijo muere, le envia la señal SIGCHLD al padre.

El padre habia ejecutado la llamada signal(SIGCHLD,handler_sigchld). Esto indica que cuando reciba la señal SIGCHLD salte al handler de atención, es decir que este donde este el padre, salta a la rutina handler_sigchld que esta abajo de todo.
En la rutina  void handler_sigchld (int type) el padre hace un:
wait(&status_chld);
Esto es: toma la condición de salida del hijo. Esto es fundamental para liberar el recurso, de lo contrario sigue ocupando tiempo en la cola de tareas del scheduler (administrador de tareas).
luego la rutina termina, y el padre vuelve a la siguiente instruccion que estaba ejecutando antes de la resepción de la señal.
En este caso el padre tambien sale ( hace un exit(0)) porque no tiene nada que hacer,pero podria haber hecho otra cosa.

Saludos

« Última modificación: 18 de Junio de 2009, 12:03:26 por alexysar »


 

anything