• Domingo 28 de Abril de 2024, 19:42

Autor Tema:  recomendacionea para matar este proceso??  (Leído 5761 veces)

pacorubio77

  • Miembro MUY activo
  • ***
  • Mensajes: 207
    • Ver Perfil
recomendacionea para matar este proceso??
« en: Domingo 15 de Marzo de 2009, 13:47 »
0
Hola,no entiendo muy bien lo de la programacion concurrente,y veo que el valor de un vector no sale fuera de un exit?

explico mi caso,,yo solo quiero hacer lo siguiente ,un padre cree tres hijos y de esos tres hijos el segundo cree otro hijo,mi problema es a la hora de matar este ultimo hijo....como es normal tengo que matar de abajo hacia arriba...y yo he pensado almacenarme el getpid de este ultimo hijo en una posicion del vector y matarlo...para mi sorpresa que cuando salgo de donde lo creo ...ya no tengo el valor en mi posicion del vector....(en el codigo represento en pantalla como v1).
graficamente tengo que hacer lo siguiente:

Pongo el código para ver si vosotros me podeis explicar porque ese valor no se guarda y si veis otra forma mejor de matarlo.....

Espero ayuda,

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

int main(){
int pid;
int i=0;
int eo;
int valor;
int tiempo=20;
int v[10];
int n=0;
        for (i=0;i<3;i++)
   {
      
            pid=fork();

       if(pid==0)
       {
         printf("el pid es: %dn",pid);
      printf("el otro pid es: %dn",getpid());


          //creo un hijo
          if(i==1)
         {
           pid=fork();
         v[n]=getpid();
         printf("v %dn",v[n]);
             if(pid==0)
          {
               printf("MACARRON %dn",pid);
            printf("EL OTRO LADO: %dn",getpid());
            sleep(3);
            printf("MAN MATAO %dn",getpid());
            int j;
            
            /*
            for(j=0;j<3;j++){
               printf("se mete j %dn",j);
               pid=fork();
               
               if(pid==0){ //esta creando hijos
                  printf("MACARRON %dn",pid);   
                  printf("EL OTRO LADO1: %dn",getpid());   
                  //sleep(3);
                  exit(0);
               }
               
               //exit(0);
            }
            sleep(5);
            //printf("aqui salen");   
            exit(0);
            */
         }
         sleep(5);
         exit(0);
         }
         sleep(15);
       exit(0);

       }
      
   printf("v1 %dn",v[n]);
        }
   
   

   sleep(10);

   int status;

   waitpid(v[0], &status, 0);
   printf("soy el proceso con pid %d y he terminadon",v[0]);   
   for(i=0;i<3;i++)
    {
   
     valor=wait(&eo);
     printf("man matao %dn",valor);
     }

     //el pid del padre
          printf("man matao1 %dn",getpid());

   exit(0);

return(0);
}
//compilar gcc nombre -o p1

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: recomendacionea para matar este proceso??
« Respuesta #1 en: Lunes 16 de Marzo de 2009, 10:23 »
0
Creo que tu error radica básicamente en que no actualizas el valor de n, que usas como índice de v[]. Si vas a usar un solo valor, ¿para qué usas un vector?

El segundo hijo y su hijo (el nieto de proceso principal), escriben ambos en v[0] sin distinción, así que al final no sabes si en v[0] tienes el PID del segundo hijo o el PID del nieto.

El proceso principal no es quien debe esperar al nieto, sino el proceso que lo crea, es decir, el segundo hijo.

P.D: como consejo, haz una función para el código ejecutado por los hijos en vez de poner todo junto, lo verás mucho más claro, tipo:

Código: C
  1. if (pid==0)
  2.    hijo_main();
  3.  
Y utiliza las etiquetas de código, no de cita  :P

Salud

pacorubio77

  • Miembro MUY activo
  • ***
  • Mensajes: 207
    • Ver Perfil
Re: recomendacionea para matar este proceso??
« Respuesta #2 en: Lunes 16 de Marzo de 2009, 13:56 »
0
Hola,muchas gracias por el interés...pero de guardar en el vector ese hijo es porque ese me da problemas ,al salir de todo no me guarda en el vector ,y no aún cual es la razón...y he pensado guardar en el vector para luego matar el proceso,,,pero si has ejecutado el código ,verás que el valor no se guarda al salir del proceso.....y cual puede ser la razón....principal?    otra cosa,cuando me dices que me haga una funcion para poner el código ejecutado por los hijos ,que quieres decir en concreto,? eso no te entendí bien....

Espero respuesta.
Gracias.

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: recomendacionea para matar este proceso??
« Respuesta #3 en: Lunes 16 de Marzo de 2009, 14:04 »
0
Cita de: "pacorubio77"
pero si has ejecutado el código ,verás que el valor no se guarda al salir del proceso
No puedo ejecutarlo en estos momentos, pero tú si me puedes decir qué valor te pone... ¿Es un valor incorrecto o es el valor de otro proceso? También sería buena idea hacer un printf() del PID del proceso nieto nada más entrar en él, como haces con los hijos en

Cita de: "pacorubio77"
printf("el pid es: %dn",pid);
printf("el otro pid es: %dn",getpid());

Aparte, es tontería la sentencia printf("el pid es: %dn",pid); porque ya sabes que es 0 por el if anterior :P

Cita de: "pacorubio77"
otra cosa,cuando me dices que me haga una funcion para poner el código ejecutado por los hijos ,que quieres decir en concreto,? eso no te entendí bien....
Simplemente no poner todo el código en main(), sino hacer una función aparte con el código de los hijos, así resulta más entendible. Sólo es un consejo personal para que mejores la presentación de tu código, nada más. No añade funcionalidad ni corrige el error.

pacorubio77

  • Miembro MUY activo
  • ***
  • Mensajes: 207
    • Ver Perfil
Re: recomendacionea para matar este proceso??
« Respuesta #4 en: Lunes 16 de Marzo de 2009, 14:11 »
0
Si,,si imprimo el valor,pero me sale un valor (como cuando no inicializas algo), es decir al principio en esa posicion si tiene el pid del proceso,pero al salir de todos los bucles ya no tengo valor ninguno....y no consigo entender eso......

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: recomendacionea para matar este proceso??
« Respuesta #5 en: Lunes 16 de Marzo de 2009, 14:22 »
0
Por favor, sé más detallista en tus respuestas... Ponle etiquetas de código a tu código y podremos entendernos mejor al indicar el número de línea. ¿O acaso creías que lo de las etiquetas de código es por capricho? Porque sinceramente no entiendo
Cita de: "pacorubio77"
al principio en esa posicion
Salud

pacorubio77

  • Miembro MUY activo
  • ***
  • Mensajes: 207
    • Ver Perfil
Re: recomendacionea para matar este proceso??
« Respuesta #6 en: Lunes 16 de Marzo de 2009, 15:34 »
0
Tiene razon,he sido poco específico, en el código indico donde no se almacena el valor en el vector,,yo he pensado que al almacenar el valor en el vector ,despues puedo matar el proceso por el pid con waitpid,aqui


 
Código: C
  1. #include<stdio.h>
  2. #include<unistd.h>
  3. #include<stdlib.h>
  4.  
  5. int main(){
  6. int pid;
  7. int i=0;
  8. int eo;
  9. int valor;
  10. int tiempo=20;
  11. int v[10];
  12. int n=0;
  13. for (i=0;i<3;i++)
  14. {
  15.  
  16. pid=fork();
  17.  
  18. if(pid==0)
  19. {
  20. printf("el pid es: %dn",pid);
  21. printf("el otro pid es: %dn",getpid());
  22.  
  23.  
  24. //creo un hijo
  25. if(i==1)
  26. {
  27. pid=fork();
  28. [b]v[n]=getpid();[/b]//aqui si almaceno v[0]
  29. printf("v %dn",v[n]);
  30. if(pid==0)
  31. {
  32. printf("MACARRON %dn",pid);
  33. printf("EL OTRO LADO: %dn",getpid());
  34. sleep(3);
  35. printf("MAN MATAO %dn",getpid());
  36. int j;
  37.  
  38. /*
  39. for(j=0;j<3;j++){
  40. printf("se mete j %dn",j);
  41. pid=fork();
  42.  
  43. if(pid==0){ //esta creando hijos
  44. printf("MACARRON %dn",pid);
  45. printf("EL OTRO LADO1: %dn",getpid());
  46. //sleep(3);
  47. exit(0);
  48. }
  49.  
  50. //exit(0);
  51. }
  52. sleep(5);
  53. //printf("aqui salen");
  54. exit(0);
  55. */
  56. }
  57. sleep(5);
  58. exit(0);
  59. }
  60. sleep(15);
  61. exit(0);
  62.  
  63. }
  64.  
  65. printf("v1 %dn",v[n]);
  66. }
  67.  
  68.  
  69.  
  70. sleep(10);
  71.  
  72. int status;
  73.  
  74. waitpid(v[0], &status, 0);
  75. [b]printf("soy el proceso con pid %d y he terminadon",v[0]);[/b]//aqui ya no llega el valor de v[0]
  76. for(i=0;i<3;i++)
  77. {
  78.  
  79. valor=wait(&eo);
  80. printf("man matao %dn",valor);
  81. }
  82.  
  83. //el pid del padre
  84. printf("man matao1 %dn",getpid());
  85.  
  86. exit(0);
  87.  
  88. return(0);
  89. }
  90.  

Te he dejado en negrita los puntos donde me da conflicto

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: recomendacionea para matar este proceso??
« Respuesta #7 en: Lunes 16 de Marzo de 2009, 16:09 »
0
Ah OK. Pero si te fijas no sale en negrita  :P

Creo que es porque cuando llega el proceso principal a ese punto, es posible que aún no se haya inicializado v[0] por los otros procesos. Si te fijas, los otros procesos hijos tardan más que el padre porque tienen un sleep(15) mientras que el padre lo tiene a 10. Prueba a inicializarlo con -1 antes de hacer ningún fork() y comprueba el valor que ponga. Pero no te fíes con que reduciendo el sleep() vaya a funcionar. Es mejor sincronizar.

Hay que tener cuidado con la programación concurrente porque no sabes en que orden se van a ejecutar los procesos, y da lugar a este tipo de problemas. Deberías usar más sincronizaciones entre los procesos (con semáforos, por ejemplo).

También para evitar estos líos te aconsejo una vez más que llames a una función aparte para el código de los hijos, pero sobre todo que plantees bien el asunto intentando tener en cuenta todos los órdenes de ejecución posibles. Es complicado, pero ahí radica la "belleza" de la concurrencia.

Salud

pacorubio77

  • Miembro MUY activo
  • ***
  • Mensajes: 207
    • Ver Perfil
Re: recomendacionea para matar este proceso??
« Respuesta #8 en: Lunes 16 de Marzo de 2009, 16:18 »
0
Ya veo que la concurrencia es un poco lio...el problema es que solo puedo utilizar fork , y para matar pues exit,wait,waitpid y todo eso...y lo que passa es que no hace lo que yo quiero,porque es todo concurrente, y para matar lo primero que tengo que hacer es matar a los hijos y despues al padre.....

Sobre lo de ponerlo bonito es lo último, primero tengo que ver los efectos de dicho programa y que salga lo que quiero,,porque por ahora me estoy haciendo un poco lio al no ser todo secuencial.....

Gracias.

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: recomendacionea para matar este proceso??
« Respuesta #9 en: Lunes 16 de Marzo de 2009, 16:37 »
0
Cita de: "pacorubio77"
el problema es que solo puedo utilizar fork , y para matar pues exit,wait,waitpid y todo eso...
Yo en ningún momento en dicho que no uses fork(). No sé a qué viene tu afirmación. Lo que debes hacer es esperar con waitpid() (estas llamadas no matan, sino ponen en bloqueo a los procesos hasta que otros cambien de estado) a los 3 procesos hijos, y que el segundo espere a su hijo y punto, no tiene más complicación. No necesitas compartir las variables porque eso lo hace más complicado todavía. Sólo el segundo hijo necesita saber del nieto, al padre no le hace falta.

Cita de: "pacorubio77"
Sobre lo de ponerlo bonito es lo último, primero tengo que ver los efectos de dicho programa y que salga lo que quiero,,porque por ahora me estoy haciendo un poco lio al no ser todo secuencial.....
No se trata de ponerlo "bonito", como tú dices, sino entendible, que son dos cosas diferentes. Tú mismo.

Yo creo que ya tienes suficiente información para dejar la teoría y empezar a hacer cambios en el código. Te repito: piensa en los procesos como independientes y que cada uno acceda a lo que tiene que acceder, nada más y nada menos, y evita compartir y acceder a información que no necesita el proceso. Es decir, evita cualquier complicación innecesaria.

Salud

pacorubio77

  • Miembro MUY activo
  • ***
  • Mensajes: 207
    • Ver Perfil
Re: recomendacionea para matar este proceso??
« Respuesta #10 en: Lunes 16 de Marzo de 2009, 16:48 »
0
mmmm..me has dejado en guardia...con waitpid....puedes ponerme un ejemplo de la funcion de waitpid?
Citar
(estas llamadas no matan, sino ponen en bloqueo a los procesos hasta que otros cambien de estado)

eso no lo entiendo...porque yo tengo que crear un hijo, crear otro hijo y este cree otro hijo y despues y por último se cree el tercero de los hijos....

Tenia erróneo el concepto de waitipid.
Ahi sigo haciendo cambios al código.

Gracias.

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: recomendacionea para matar este proceso??
« Respuesta #11 en: Lunes 16 de Marzo de 2009, 17:10 »
0
waitpid() tiene varias formas de funcionar, pero la que te interesa a ti es simple:

Código: C
  1. waitpid(pid_hijos,NULL,0);
  2.  
Por ejemplo, en tu caso, yo haría (ten en cuenta que no he probado esto):

Código: C
  1. //Para guardar los PIDs de los hijos
  2. pid_t hijos[3];
  3.  
  4. //Vamos a crear los 3 hijos
  5. for(i=0;i<3,i++){
  6.    //Fork
  7.    pid = fork();
  8.    //Si es un hijo, pues que haga lo que tenga que hacer
  9.    if (pid == 0)
  10.       hijos_main();
  11.    //Si es el padre, guarda el PID del hijo en el vector
  12.    else
  13.       hijos[i] = pid;
  14. }
  15.  
  16. //Esperamos a que termine cada uno de los hijos.
  17. for(i=0;i<3;i++)
  18.    waitpid(hijos[i],NULL,0);
  19.    //También vale esta, esperar a que termine cualquier hijo (esperamos a 3 hijos, en cualquier orden).
  20.    //waitpid(-1,NULL,0);
  21.  
  22.  
Y para el segundo hijo y su propio hijo, pues de forma muy parecida a cómo lo hace el padre.

Salud

su -

  • Moderador
  • ******
  • Mensajes: 2349
    • Ver Perfil
Re: recomendacionea para matar este proceso??
« Respuesta #12 en: Martes 17 de Marzo de 2009, 01:27 »
0
Código: C
  1. pid=fork();
  2.  
  3. if(pid==0)
  4. {
  5. ...
  6.  
Naturalmente eso no es posible, al menos en Unix, nunca tendras un PID igual a 0, y menos si un usuario lo ejecuta...
*******PELIGRO LEE ESTO!!*******

There is no place like 127.0.0.1

Conecto luego existo, no conecto luego insisto.

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: recomendacionea para matar este proceso??
« Respuesta #13 en: Martes 17 de Marzo de 2009, 09:23 »
0
Cita de: "su -"
al menos en Unix, nunca tendras un PID igual a 0, y menos si un usuario lo ejecuta...
Tienes razón, pero no. Desde luego en POSIX no hay PID = 0 da igual si lo ejecuta el usuario o no. Pero este no es un PID real. Es el valor que devuelve fork() para el proceso hijo, de ahí hijo_main(). Con getpid() obtendrías el PID. Como veo que no estás familiarizado con fork(), haz un man 2 fork.

Salud

pacorubio77

  • Miembro MUY activo
  • ***
  • Mensajes: 207
    • Ver Perfil
Re: recomendacionea para matar este proceso??
« Respuesta #14 en: Martes 17 de Marzo de 2009, 10:40 »
0
Esta noche contaré los avances ,que no han sido  muchos,porque ahora viene la complicacion....y quiero que me deis una idea.... hasta ahora he explicado la forma básica de como lo tenía que hacer básico....la cuestion es que tengo que hacerlo de una forma recursiva....lo explicaré esta tarde más detallado...

pacorubio77

  • Miembro MUY activo
  • ***
  • Mensajes: 207
    • Ver Perfil
Re: recomendacionea para matar este proceso??
« Respuesta #15 en: Martes 17 de Marzo de 2009, 23:54 »
0
Hola....lo estoy haciendo de manera recursiva....pero de manera recursiva ya si que no puedo matar los procesossssss.....que alguien me ayudeeeeeee...es necesario que ponga codigo?


Agradecería ayudaaaaaa.....

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: recomendacionea para matar este proceso??
« Respuesta #16 en: Miércoles 18 de Marzo de 2009, 10:00 »
0
Cita de: "pacorubio77"
pero de manera recursiva ya si que no puedo matar los procesossssss.....que alguien me ayudeeeeeee
No te preocupes, seguro que es más fácil de lo que ahora parece  ;)

Cita de: "pacorubio77"
es necesario que ponga codigo?
Creo que es evidente, ¿no te parece?

P.D: ¿te funcionó de la otra forma?

pacorubio77

  • Miembro MUY activo
  • ***
  • Mensajes: 207
    • Ver Perfil
Re: recomendacionea para matar este proceso??
« Respuesta #17 en: Miércoles 18 de Marzo de 2009, 10:11 »
0
pero es mejor que te lo mande por privado...el código si no te importa...y asi lo puedes ver....vale?

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: recomendacionea para matar este proceso??
« Respuesta #18 en: Miércoles 18 de Marzo de 2009, 10:37 »
0
En mi opinión definitvamente deberías publicarlo aquí. Si hemos estado discutiendo de ello aquí hasta ahora, no veo dónde está el problema.  :huh:

pacorubio77

  • Miembro MUY activo
  • ***
  • Mensajes: 207
    • Ver Perfil
Re: recomendacionea para matar este proceso??
« Respuesta #19 en: Miércoles 18 de Marzo de 2009, 10:39 »
0
el problema está en la copia...que alguien que busque y tenga que entregar la misma practica...lo copie...ese es el problema....

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: recomendacionea para matar este proceso??
« Respuesta #20 en: Miércoles 18 de Marzo de 2009, 10:41 »
0
Y que te la resuelva m0skit0 o cualquiera de los demas esta bien  -_-  &lt;_&lt;

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: recomendacionea para matar este proceso??
« Respuesta #21 en: Miércoles 18 de Marzo de 2009, 11:26 »
0
Cita de: "pacorubio77"
que alguien que busque y tenga que entregar la misma practica...lo copie
Bueno, con todo el respeto, eso es asunto tuyo, no mío.

pacorubio77

  • Miembro MUY activo
  • ***
  • Mensajes: 207
    • Ver Perfil
Re: recomendacionea para matar este proceso??
« Respuesta #22 en: Miércoles 18 de Marzo de 2009, 13:43 »
0
Tienes razon esta tarde pondré el código para que lo veais y si podeis me ayudeis a matar los procesos....el lio que tengo es que al hacerlo recursiva la dificultad es matar a los hijos antes que al padre....esta tarde pondré aqui el código....

Gracias.

su -

  • Moderador
  • ******
  • Mensajes: 2349
    • Ver Perfil
Re: recomendacionea para matar este proceso??
« Respuesta #23 en: Miércoles 18 de Marzo de 2009, 20:40 »
0
Cita de: "m0skit0"
Cita de: "su -"
al menos en Unix, nunca tendras un PID igual a 0, y menos si un usuario lo ejecuta...
Tienes razón, pero no. Desde luego en POSIX no hay PID = 0 da igual si lo ejecuta el usuario o no. Pero este no es un PID real. Es el valor que devuelve fork() para el proceso hijo, de ahí hijo_main(). Con getpid() obtendrías el PID. Como veo que no estás familiarizado con fork(), haz un man 2 fork.

Salud
:angry: Es la mala costumbre que te dejan ciertos scripts... ya que normalmente yo puede hacer algo como esto:
Código: Perl
  1. #!/usr/bin/perl
  2. print "Parent ID: $$n";
  3. fork and do {
  4.     print "Hello, I am $0 Jr. and my ID is $$n";
  5. } or die "Error: $!n"
  6.  
  7.  
Es una mala idea, incluso para un script... gracias por la correccion.
*******PELIGRO LEE ESTO!!*******

There is no place like 127.0.0.1

Conecto luego existo, no conecto luego insisto.

pacorubio77

  • Miembro MUY activo
  • ***
  • Mensajes: 207
    • Ver Perfil
Re: recomendacionea para matar este proceso??
« Respuesta #24 en: Jueves 19 de Marzo de 2009, 00:37 »
0
Hola,voy a poner el código de mi imposibilidad de matar los hijos ya que lo tengo echo de forma recursiva,pero antes era para explicaros como va el problema,El problema es que tienes que meter un argumento que es la profundidad del programa, por ejemplo se la profundidad 4 , tenemos al padre que tenemos tres hijos, de esos tres, el segundo creará otro hijo, y de ese hijo ,crea otros tres hijos, eso lo tengo todo echo, (podeis comprobar poniendolo en otro terminal con pstree -p | grep ejecutabledelprograma),porque lo tengo todo creado,pero la dificultad es matar los hijos antes que los padres, y eso es lo que me se está haciendo muy dificil...

Yo he tenido una idea,almacenar los pids en el vector vpids y asi teniendolos todos pues ir matándolos...,pero no se porque se almacenan,pero llega un momento que se pierden los valores....

Por favor rogaría que me lo mirarais ,ya que llevo tiempo modificando...solo es como matar los procesos.....

Agradezco ayuda.....
Pongo el código



Espero respuesta.
Gracias.