Que extraño, yo probe cambiando el printf() en el lector por lo siguiente:
printf("%d: ", getpid());
for (int i = 0; i < leido; i++)
putchar(buf[i]);
putchar('\n');
y funciono bien. La salida fue:
4166: Mensaje numero 1 pid: 4167
Mensaje numero 2 pid:
4166: 4167
Mensaje numero 3 pid: 4167
Si podes segui con gdb el ciclo que imprime y fijate a mano que
contiene el buffer.
Saludos!
2008/10/22 San Martín, Matías <[EMAIL PROTECTED]>:
> Parece razonable, igual una prueba rapida me siguio andando mal. Lo voy
> a ver con mas detalle y despues comento.
>
> gracias por el hint. saludos
>
> El mié, 22-10-2008 a las 13:10 -0300, juanii escribió:
>> Si, creo que se lo que te esta pasando, y sigue siendo gracias al buen
>> señor que invento los strings ASCIIZ :)
>> Resulta que si mandas el \0 final vos estas mandando tres mensajes de
>> (appx) 25 cada uno con su \0 al final.
>> Si el escritor mando varios mensajes (mas de uno) antes que el lector
>> los pudiera consumir, al primer read() va a traer en los 50 bytes el
>> primer mensaje completo (incluyendo \0 final :) y parte del segundo
>> mensaje. Cuando haces printf() del buffer se frena en el primer \0 y
>> da la sensacion que el contenido del segundo "se perdio" aunque en
>> verdad esta ahi en el buffer. Si imprimis el contenido byte por byte
>> hasta llegar al valor de la var "leido" (y no con printf("%s")) vas a
>> ver exactamente lo que esta pasando.
>>
>> Saludos!
>>
>> 2008/10/22 San Martín, Matías <[EMAIL PROTECTED]>:
>> > Es cierto lo que vos decis, pero aun corrigiendo esos errores el
>> > comportamiento extraño sigue pasando. Si al escritor le digo que mande
>> > el \0 del final de las cadenas (en la linea: 'size_t count =
>> > strlen(cadena);// + 1' descomento el + 1) me siguen llegando mal los
>> > mensajes del otro lado.
>> > Por ejemplo, si dejo todo como esta (con las correcciones indicadas
>> > [1] ) y descomento el '// + 1' la salida que obtengo es:
>> >
>> > 7386: Mensaje numero 1 pid: 7387
>> >
>> > 7386: 7387
>> >
>> > Si dejo comentado anda todo ok.
>> >
>> > Lo extraño tambien es que si cambio el tamaño del buffer de lectura por
>> > ejemplo poniendolo en 21, la salida que obtengo es
>> >
>> > 7467: Mensaje numero 1 pid
>> > 7467: : 7472
>> >
>> > 7467: ro 2 pid: 7472
>> >
>> > 7467: aje numero 3 pid: 74
>> > 7467: 72
>> >
>> >
>> > alguna pista de que puede ser?
>> >
>> > saludos
>> >
>> >
>> > [1] el bloque de codigo que cambio con las correcciones queda:
>> >
>> > const unsigned short count = 51; //tamaño del buffer de lectura
>> > char buf[count];
>> > memset(buf,0,count);
>> >
>> > while ((leido = read(fd, buf,count-1)) > 0)
>> >
>> >
>
> _______________________________________________
> Lista de correo Programacion.
> [email protected]
> http://listas.fi.uba.ar/mailman/listinfo/programacion
>
--
juanii
_______________________________________________
Lista de correo Programacion.
[email protected]
http://listas.fi.uba.ar/mailman/listinfo/programacion