[Previo por Fecha] [Siguiente por Fecha] [Previo por Hilo] [Siguiente por Hilo]
[Hilos de Discusión] [Fecha] [Tema] [Autor]¡Hola!
Escribo el mini programa y comento un poco (el original está al final, con
el mail de Eloy). Pongo mis comentarios tras asteriscos.
#include <stdio.h>
* No tenías estos includes en el programa (el último es necesario para el
* fork, quizá simplemente para pillar el valor de salida de la función,
* pero siempre conviene ponerlo). Los dos primeros son para el waitpid();
#include <sys/types.h> /* para el wait */
#include <sys/wait.h> /* para el wait */
#include <unistd.h> /* para el fork */
void algo()
{
* Siempre que se va a escribir en una zona de memoria conviene tener el
* espacio reservado, bien con malloc(), bien con un array. En el programa
* inicial simplemente era un puntero que apuntaba al espacio en el que
* se escribía
char cadena[80]; /* reservamos un espacio */
* Esta es una forma simple de vaciar una cadena. Ahora no es necesario,
* pero...
cadena[0]='\0'; /* la cadena esta vacia */
scanf("%s",cadena);
printf("Se leyo: %s\n",cadena);
}
main()
{
* Esto es para pillar la salida del fork
pid_t p_hijo;
algo();
* Así la pillamos
if((p_hijo=fork())==0)
{
algo();
exit(1);
}
printf("Listo\n");
* Y no podemos ser tan malos padres que mandemos al hijo a por el
* periódico y no lo esperemos, ¿verdad?.
* La función waitpid nos permite especificar por qué hijo se quiere
* esperar (en este, caso, solamente hay uno). Los otros parámetros
* son para enterarnos del estado del hijo y cosas así.
waitpid(p_hijo,NULL,0);
exit(0);
}
On Tue, 11 May 1999, Eloy Espozo Espinoza wrote:
> holax de nuevo
>
> tons me explico mejor: estoy tratando de hacer un programa que lea
> un mensaje de distintos procesos, el codigo es como el que sigue:
>
>
>
> #include <stdio.h>
>
> void algo()
> {
> char *cadena;
> scanf("%s",&cadena);
> printf("Se leyo: %s",cadena);
> }
>
> main()
> {
> algo();
> if(fork()==0)
> {
> algo();
> exit(1);
> }
> printf("Listo");
> exit(0);
> }
>
>
>
> Al correrlo, la primera llamada a al funcion algo corre ok pero la segunda
> llamada a la funcion algo, parece que no se
> ejecutara, termina el programa y sale
> Ahora hago lo mismo sin tuilizar fork y corre perfectamente.
> (bueno, tiene los problemas de memoria propios y demas)
>
> Cual seria el cogdigo correcto? como deberia estructurar mi programa?
> ayuidenme profavor !!
>
>
> Que puede ser me tiene muy intrigado, que puedo leer para saber esto o que
> estoy haciendo mal talvez omiti algo, en fin
>
>
> de nuevo gracias
>
>
> Eloy
Una nota final (para quien no lo sepa, por supuesto). Cuando se realizan
modificaciones en un programa y se quieren mostrar las mismas, la mejor
forma es guardar una copia del original y utilizar el comando diff para
ambos ficheros (original y modificado). En este caso casi no compensa,
porque son ficheros muy pequeños, pero ahí va:
aragorn[~/programas/prueba]% diff -u fork.c fork-inicial.c
--- fork.c Wed May 12 12:28:25 1999
+++ fork-inicial.c Wed May 12 12:15:50 1999
@@ -1,27 +1,20 @@
#include <stdio.h>
-#include <sys/types.h> /* para el wait */
-#include <sys/wait.h> /* para el wait */
-#include <unistd.h> /* para el fork */
-
void algo()
{
- char cadena[80]; /* reservamos un espacio */
- cadena[0]='\0'; /* la cadena esta vacia */
- scanf("%s",cadena);
+ char *cadena;
+ scanf("%s",&cadena);
printf("Se leyo: %s\n",cadena);
}
main()
{
- pid_t p_hijo;
algo();
- if((p_hijo=fork())==0)
+ if(fork()==0)
{
algo();
exit(1);
}
printf("Listo\n");
- waitpid(p_hijo,NULL,0);
exit(0);
}
Como veis, tiene un - delante de cada línea que yo he escrito, y un +
delante de las viejas que han cambiado.
Que os sirva,
Carlos.
_______Carlos Costa Portela_______________Password Technologies______
| e-mail: ccosta en servidores net | http://www.registros.net |
| www: http://ccp.servidores.net | http://www.avisaboe.com |
|http://compuconsejos.servidores.net| http://moana.servidores.net |
|__Tódalas persoas maiores foron nenos antes, pero poucas se lembran__|