[C con Clase] duda con printf y sockets

Matias V. fockewulffw44j en gmail.com
Mar Jun 2 00:25:30 CEST 2009


Gracias por las respuestas.

Comprobe que es algo que no tiene nada que ver con el hecho de que este
usando sockets. Compile y ejecute el siguiente código:

#include <stdio.h>

int main(void)
{
    printf("Algo");
    while(1);
    return 0;
}

Y a diferencia de lo que yo esperaba (que el programa imprimiera la cadena
Algo y luego se colgara), directamente se quedo colgado y no imprimio nada,
es decir es como ustedes dicen, las salidas quedan almacenadas en un buffer
y solo ante determinados eventos el contenido es mostrado en pantalla.

Los printf los había colocado en el programa a modo de flags para poder
entender como se hiba ejecuntando el codigo del mismo, ya que tengo una duda
respecto a este tema, pero para resolverla es mas claro enviar otro mensaje
a la lista.

Saludos.


El 1 de junio de 2009 9:29, Steven Davidson <srd4121 en njit.edu> escribió:

> Hola Matías,
>
> Matias V. wrote:
>
>> Hola
>>
>>
> [CORTE]
>
>  La ventana donde ejecute el programa servidor pasa a quedar asi:
>>
>> $ ./servidor
>> f1f2f3f4f5f6server: got connection from 190.190.9.104
>> f7 $
>>
>>
>> Es decir aparece todo el texto.
>>
>> Lo que necesitaria conocer es alguna explicación tecnica de porque el
>> texto de los printf no va apareciciendo a medida que se ejecuta el
>> programa.
>>
>>
> No es un problema de la función 'printf()', sino de 'stdout'. La salida
> estándar almacena completamente los datos a enviar. Cuando el almacenamiento
> (o "búfer") se llena al máximo, entonces automáticamente es enviado como un
> bloque. La otra forma de enviar la información es invocando 'fflush()', que
> ciertamente otras funciones realizan esta tarea automáticamente, como es
> cerrar un fichero o canal de salida.
>
> Sugiero invocar 'fflush()' para el canal de 'stdout' si quieres mantener
> cierta sincronización.
>
> También podrías cambiar el almacenamiento de 'stdout' a través de la
> función 'setvbuf()'. Por ejemplo,
>
> int main()
> {
>  setvbuf( stdout, 0, 0, _IONBF );
>  ...
> }
>
> De esta manera, indicamos que 'stdout' no será almacenado. Esto implica que
> cualquier dato enviado a la salida estándar será inmediatamente enviado. Eso
> sí, no te puedo garantizar si esto funcionará para 'stdout', al tratarse de
> un "fichero" especial.
>
>
> Espero que esto te ayude.
>
> Steven
>
>
> _______________________________________________
> Lista de correo Cconclase Cconclase en listas.conclase.net
> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20090602/da2b44c0/attachment.html>


Más información sobre la lista de distribución Cconclase