Programación General > C/C++

 recomendacionea para matar este proceso??

<< < (2/6) > >>

m0skit0:
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
--- Fin de la cita ---
Salud

pacorubio77:
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 ---#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 hijoif(i==1){pid=fork();[b]v[n]=getpid();[/b]//aqui si almaceno v[0]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 hijosprintf("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);[b]printf("soy el proceso con pid %d y he terminadon",v[0]);[/b]//aqui ya no llega el valor de v[0]for(i=0;i<3;i++){ valor=wait(&eo);printf("man matao %dn",valor);} //el pid del padreprintf("man matao1 %dn",getpid()); exit(0); return(0);} 
Te he dejado en negrita los puntos donde me da conflicto

m0skit0:
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:
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:

--- Cita de: "pacorubio77" ---el problema es que solo puedo utilizar fork , y para matar pues exit,wait,waitpid y todo eso...
--- Fin de la cita ---
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.....
--- Fin de la cita ---
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

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

[*] Página Anterior

Ir a la versión completa