Cómo funciona JustAnswer:
  • Preguntar a un Experto
    Los expertos tienen muchos conocimientos valiosos y están dispuestos a ayudar en cualquier pregunta. Credenciales confirmadas por una empresa de verificación perteneciente a Fortune 500.
  • Obtener una respuesta profesional
    Por correo electrónico, mensaje de texto o notificación mientras espera en su sitio. Haga preguntas de seguimiento si lo necesita.
  • Garantía de satisfacción plena
    Garantizamos tu satisfacción.
Formule su propia pregunta a expertoinfor...
expertoinformatico87
expertoinformatico87, Técnico informático
Categoría: Programación
Clientes satisfechos: 5
Experiencia:  tecnico explotacion S.Informaticos
63104894
Escriba su pregunta sobre Programación aquí...
expertoinformatico87 está en línea ahora

Deseo que me pudiesen ayudar con un aspecto muy concreto de

Pregunta del cliente

Deseo que me pudiesen ayudar con un aspecto muy concreto de progarmacion en c:
se trata de que he realizado un programa en C llamado padre que crea un proceso “hijo” el cual deberá calcular los 10 primeros números de la sucesión de Fibonacci e imprimirlos por salida estándar (formato “ HIJO: fibonacci % N =%M\n ”
donde %N y %M representan el índice y el valor del correspondiente número de la sucesión)

Mientras el ”hijo” realiza el cálculo, el “padre” deberá esperar a que termine.Una vez haya terminado, el hijo comunicará al proceso “padre” la información necesaria para poder continuar con el cálculo de la sucesión.De esa manera el padre podrá continuar y calcular los siguientes 10 números de la sucesión e imprimirlos por salida estándar (formato “ PADRE: fibonacci %N=%M\n”
donde %N y %M representan el índice y el valor del correspondiente número de la sucesión)
El “padre” no deberá nunca calcular la sucesión desde el inicio.
DUDA CONCRETA:
Este programa se puede resolver creando un proceso hijo, realizando la llamada al sistema fork.
Después hay que comprobar si estás en el proceso hijo, y entonces ejecutar diez iteraciones de la sucesión de Fibonacci : if (fork()==0…..etc.., ir pintando por pantalla los resultados (hasta aquí todo fácil)
A partir de aquí debe continuar el proceso padre, después de que el hijo haga un exit al terminar el bucle.

1- Escribir un wait para que el padre espere a que termine el hijo.
2- Antes de que el hijo haga el exit, deberás pasar al proceso padre los dos últimos valores que calculó el proceso hijo, para que el padre siga con la serie.

El punto dos es el más complicado no sé cómo se hace con código o al menos no me sale veo que se trata de dos procesos independientes (cada uno con su PID) ejecutándose de manera concurrente, y habrá de utilizarse un mecanismo de comunicación entre procesos para pasar estas variables de un proceso a otro.
Posibilidades para pasar los valores de la serie de Fibonacci F9 y F10 del hijo al padre (para que este último calcule el F11):
1- después de calcular el hijo los valores de la serie y haberlos almacenado en un array 1..10, puedes utilizar dos tuberías sin nombre, abrirlas en el extremo de escritura y pasar los dos últimos valores del array, uno en cada tubería. El padre, después de que el hijo haga el exit, leerá las tuberías y con estos valores seguirá con la serie.
2- Utilizando una zona de memoria compartida, el hijo puede escribir en esa zona de memoria los valores de la serie, y después el padre podrá leerlos desde allí.

ME PUEDEN AYUDAR CON HACER EL PUNTO 1 Y/O 2 en progarmacion c?
Enviada: hace 5 año.
Categoría: Programación
Experto:  expertoinformatico87 escribió hace 5 año.
hola bienvenido

mira este manual te puede ser de ayuda al problema que tienes.

http://www.redes-linux.com/apuntes/so1/practicas/pr3.pdf
Cliente: escribió hace 5 año.
voy a mirar a ver si me sirve, aunque estaría bien ser más concreto
Experto:  expertoinformatico87 escribió hace 5 año.
Hola, de nuevo espero ser de utilidad en tus dudas,

Mira, creo que esto es lo que estas buscando, a tu problema con programacion. "padre"

Procesos concurrentes: llamadas fork y wait

Para crear nuevos procesos, el UNIX dispone únicamente de una llamada al sistema, fork, sin ningún tipo de parámetros. Su prototipo es

int fork();

Al llamar a esta función se crea un nuevo proceso (proceso hijo), idéntico en código y datos al proceso que ha realizado la llamada (proceso padre). Los espacios de memoria del padre y el hijo son disjuntos, por lo que el proceso hijo es una copia idéntica del padre que a partir de ese momento sigue su vida separada, sin afectar a la memoria del padre; y viceversa.

Siendo más concretos, las variables del proceso padre son inicialmente las mismas que las del hijo. Pero si cualquiera de los dos procesos altera una variable, el cambio sólo repercute en su copia local. Padre e hijo no comparten memoria.

El punto del programa donde el proceso hijo comienza su ejecución es justo en el retorno de la función fork, al igual que ocurre con el padre.

Si el proceso hijo fuera un mero clon del padre, ambos ejecutarían las mismas instrucciones, lo que en la mayoría de los casos no tiene mucha utilidad. El UNIX permite distinguir si se es el proceso padre o el hijo por medio del valor de retorno de fork. Esta función devuelve un cero al proceso hijo, y el identificador de proceso (PID) del hijo al proceso padre. Como se garantiza que el PID siempre es no nulo, basta aplicar un if para determinar quién es el padre y quién el hijo para así ejecutar distinto código.

Con un pequeño ejemplo:

main() { int x=1; if ( fork()==0 ) { printf ("Soy el hijo, x=%d\n",x); } else { x=33; printf ("Soy el padre, x=%d\n",x); } } Este programa mostrará por la salida estándar las cadenas "Soy el hijo, x=1" y "Soy el padre, x=33", en un orden que dependerá del compilador y del planificador de procesos de la máquina donde se ejecute.

Como aplicación de fork a la ejecución de programas, véase este otro pequeño ejemplo, que además nos introducirá en nuevas herramientas:

1 if ( fork()==0 ) 2 { 3 execlp ("ls","ls","-l","/usr/include",0); 4 printf ("Si ves esto, no se pudo ejecutar el \ 4b programa\n"); 5 exit(1); 6 } 7 else 8 { 9 int tonta; 10 wait(&tonta); 11 }

Este fragmento de código lanza a ejecución la orden ls -l /usr/include, y espera por su terminación.

En la línea 1 se verifica si se es padre o hijo. Generalmente es el hijo el que toma la iniciativa de lanzar un fichero a ejecución, y en las líneas 2 a la 6 se invoca a un programa con execlp. La línea 4 sólo se ejecutará si la llamada execlp no se ha podido cumplir. La llamada a exit garantiza que el hijo no se dedicará a hacer más tareas.

Las líneas de la 8 a la 11 forman el código que ejecutará el proceso padre, mientras el hijo anda a ejecutar sus cosas. Aparece una nueva llamada el sistema, la función wait. Esta función bloquea al proceso llamador hasta que alguno de sus hijos termina. Para nuestro ejemplo, dejará al padre bloqueado hasta que se ejecute el programa lanzado o se ejecute la línea 5, terminando en ambos casos el discurrir de su único hijo.

Es decir, la función wait es un mecanismo de sincronización entre un proceso padre y sus hijos.

 

La llamada wait recibe como parámetro un puntero a entero donde se deposita el valor devuelto por el proceso hijo al terminar; y retorna el PID del hijo. El PID del hijo es una información que puede ser útil cuando se han lanzado varios procesos hijos y se desea discriminar quién exactamente ha terminado. En nustro ejemplo no hace falta este valor, porque sólo hay un hijo por el que esperar.

 

Como ejemplo final, esta función en C es una implementación sencilla de la función system, haciendo uso de fork, wait y una función exec.

int system ( const char* str ) { int ret; if (!fork()) { execlp ( "sh", "sh", "-c", str, 0 ); return -1; } wait (&ret); return ret; }







Si estas de acuerdo pulsa aceptar! muchas Gracias!!
Cliente: escribió hace 5 año.
Dejeme que lo mire este fin de semana y se lo acepto, sinceramente