C/Visual C - pipes

 
Vista:

pipes

Publicado por dani (1 intervención) el 10/12/2005 16:09:34
Muy buenas, a ver si alguien me puede ayudar.
Estoy haciendo una practica de comunicación entre procesos en C. TEngo un proceso padre que se tiene que comunicar con un proceso hijo mediante un pipe. Y tengo un problema, porque el proceso padre tiene que escribir en el pipe un estructura de datos que el proceso hijo tiene que leer, pero no me funciona. lo que hago es esto:

proceso padre
......
write (p1[ESCRITURA],&datos,tam);
........

y el proceso hijo
.......
read (p1[LECTURA],&datos,tam);
.......

donde datos es la estructura y tam el tamaño de esta.

Hay alguien que me pueda ayudar!!!!

Muchísimas gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil

RE:pipes

Publicado por chuidiang (73 intervenciones) el 10/12/2005 20:47:33
Hola:

No estaría de más que dieras algunos detalles más o pusieras algo más de código. ¿Por qué no te funciona? ¿Se cae el programa con un segmentation fault, core dumped? ¿No se cae nada, pero no puedes leer en absoluto los datos en el proceso hijo? ¿Lees los datos en el proceso hijo pero no son los que esperas?....

Se bueno.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:pipes

Publicado por dani (2 intervenciones) el 11/12/2005 14:39:00
El programa se me queda colgao, se queda esperando algo.
El codigo es el siguiente:

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

struct reg {
int id;
char cargo[10];
int asistencia;
} datos;

int cont1,cont2,cont3; //identificadores de los procesos hijos
int p1[2], p2[2], p3[2]; /*pipes para comunicar el aministrador con los contables*/
int p_respuesta[2]; //pipe para enviar la informaci\363n de los contables al administrador
FILE *fd;
int i;
int tam;

tam=sizeof(datos);

if(argc != 3)
{
printf ("Error en sintaxi: %s <argumento> <argumento>\n",argv[0]);
exit(-1);
}

/*Creamos los pipes y miramos si se ha producido algun error*/

if( pipe(p1)<0 || pipe(p2)<0 || pipe(p3)<0 || pipe(p_respuesta)<0 )
{
perror ("Al crear algun pipe\n");
exit (-1);
}

/*Abrimos el fichero y leemos los datos*/

if ( (fd=fopen(argv[1],"r")) <0 )
perror ("Al abrir el fichero\n");

i= fscanf (fd, "%d %s %d",&datos.id, &datos.cargo, &datos.asistencia);

while (i != EOF)
{
//printf ("%s\n",datos.cargo);
// i= fscanf (fd, "%d %s %d",&datos.id, &datos.cargo, &datos.asistencia);

if (datos.cargo=="PERSONAL")
{
write (p1[ESCRITURA],&datos,tam);
}
i= fscanf (fd, "%d %s %d", &datos.id, &datos.cargo, &datos.asistencia);
}

/***********CREAMOS LOS PROCESOS HIJOS (CONTABLES)***********/

if ( (cont1=fork()) <0)
{
perror ("Al crear el Contable 1\n");
exit(-1);
}

if(cont1==0)
{
close (p1[ESCRITURA]); /*cerramos los pipes que no vayamos a utilizar*/
close (p2[LECTURA]);
close (p2[ESCRITURA]);
close (p3[LECTURA]);
close (p3[ESCRITURA]);
close (p_respuesta[LECTURA]);
read (p1[LECTURA],&datos,tam);
printf ("Soy el contable 1\n");
printf ("Horas %d de %s\n",datos.asistencia,datos.cargo);

exit (-1);
}

Espero que te sirva.
Muchas gracias por todo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

RE:pipes

Publicado por chuidiang (73 intervenciones) el 12/12/2005 05:34:14
Hola:

El programa se puede quedar colgando en espera en el read() del pipe. Si no hay nada que leer, se queda esperando que haya algo para leer.

Verifica que se realiza la escritura write (puedes poner un printf justo detras y dentro del if para indicar que se ha escrito. Cualquier error en la lectura que haga que ahi no ponga exactamente "PERSONAL" puede hacer que no se escriba nada.

Se bueno.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar