Función de suspensión en Linux, función de fflush y problema de búfer

  

//---------------------- función de suspensión ()

Nombre de la función: dormir Función: ejecutar suspender por un período de tiempo Uso: unsigned int sleep (int sin signo); Ejemplo de programa:

#include < unistd.h > #include < stdio.h >

int main (void) {int i;

para (i = 1; i < 5; i ++) {printf (" Durmiendo por% d segundos \\ n ", i); sleep (i }; return 0;}

Otro:

El prototipo de la función Sleep en VC ++ es:

void Sleep (DWORD dwMilliseconds);

Linux El prototipo de la función de suspensión es:

unsigned int sleep (unsigned int seconds);

MFC es microsegundos, y linux es segundos. La función de suspensión de subprocesos de microsegundos en Linux es:

void usleep (usec long sin signo); int usleep (usec long sin firmar); /* SUSv2 * /

o usa la función de selección + timeval La estructura también puede ser (hasta los microsegundos),

o usar la función pselect + timespec (puede ser precisa en nanosegundos, ¡lo suficientemente precisa!)

//------- --------- Función fflush ()

La siguiente es la definición de C99 de la función fflush:

int fflush (FILE * stream);

if stream Al señalar el flujo de salida o el flujo de actualización, y la operación más reciente de este flujo de actualización no se ingresa, la función fflush transferirá los datos que se escribirán en el flujo al entorno host para escribir en el archivo. De lo contrario, su comportamiento es indefinido.

El texto original es el siguiente:

int fflush (FILE * stream);


Si el stream apunta a un flujo de salida o un flujo de actualización en el que el más reciente La operación no se ingresó, la función fflush hace que se escriban en el archivo los datos no escritos de esa secuencia al entorno del host; de lo contrario, el comportamiento no está definido.

donde, el ambiente del host se puede entender como Sistema operativo o kernel, etc.

Por lo tanto, si el flujo apunta a un flujo de entrada (como stdin), el comportamiento de la función fflush no está definido. Por lo tanto, el uso de fflush (stdin) no es correcto, al menos no es portátil.

La función de la función de biblioteca fflush es escribir todos los datos no escritos en la secuencia del archivo inmediatamente. Por ejemplo, puede usar esta función para asegurarse de que se envíe un mensaje interactivo al terminal antes de intentar leer una respuesta del usuario. El uso de esta función también garantiza que los datos importantes se hayan escrito en el disco antes de que el programa continúe ejecutándose. A veces, al depurar un programa, puede usarlo para determinar si el programa está escribiendo datos en lugar de suspenderse. Tenga en cuenta que llamar a la función fclose implícitamente realiza una operación de descarga, por lo que no tiene que llamar a fflush antes de fclose.

Esta función debe usarse con moderación. El libro dice que fflush solo se usa para excepciones. Normalmente, fclose y EXIT deben usarse para actualizar el búfer de salida. No se puede usar así bajo LINUX.

*





*

//---- -------------- Problemas de búfer

*

Se pueden ver los detalles: un resumen de la comprensión de los flujos y los búferes y la solución a los problemas generales de entrada estándar

*

*



El propósito del almacenamiento en caché de E /S estándar es minimizar el uso de llamadas de lectura y escritura. Cantidad. También almacena en caché automáticamente cada flujo de E /S, evitando la molestia de tener que considerar esto. Desafortunadamente, lo más confuso de la biblioteca de E /S estándar es su caché. Los diferentes tipos de caché a menudo hacen que las personas se sientan abrumadas cuando realizan operaciones de E /S. La E /S estándar proporciona tres tipos de almacenamiento en caché: caché completo, caché de fila y sin caché.

Lo más claro que se puede decir es la "Programación avanzada para entornos UNIX" de Stevens. Lo siguiente está tomado de la "Programación avanzada para entornos UNIX" de Stevens Capítulo 5:


//******************

La E /S estándar proporciona tres tipos de almacenamiento en caché: (1) almacenamiento en caché completo. En este caso, la operación de E /S real se realiza cuando se llena el búfer de E /S estándar. Los archivos que residen en el disco generalmente se almacenan en caché completamente por las bibliotecas de E /S estándar. Cuando se realiza la primera operación de E /S en un flujo, la función de E /S estándar asociada usualmente llama a m a l l o c (consulte la Sección 7.8) para obtener el caché a usar. El término actualización (f l u s h) describe la operación de escritura de la caché de E /S estándar. La memoria caché se puede actualizar automáticamente mediante las rutinas de E /S estándar (por ejemplo, cuando se llena una memoria caché), o se puede llamar a la función ff l u s h para actualizar una secuencia. Vale la pena señalar que en el entorno U N I X, la actualización tiene dos significados. En el caso de las bibliotecas de E /S estándar, actualizar significa escribir el contenido de la memoria caché en el disco (la memoria caché solo se puede rellenar parcialmente). En términos de controladores de terminal (como la función t c f l u s h descrita en el Capítulo 11), actualizar significa descartar datos en el caché existente.
(2) Caché de fila. En este caso, la biblioteca de E /S estándar realiza operaciones de E /S cuando se encuentran nuevos caracteres de línea en la entrada y la salida. Esto nos permite generar un carácter a la vez (utilizando la función de fputc de E /S estándar), pero la operación de E /S real solo se realiza después de que se haya escrito una línea. El almacenamiento en búfer de fila se usa normalmente cuando la secuencia involucra un terminal (como la entrada estándar y la salida estándar). Hay dos restricciones en el almacenamiento en caché de filas. La primera es porque la longitud de la memoria caché utilizada por la biblioteca de E /S estándar para recopilar cada fila es fija, por lo que siempre que la memoria caché se llene, las operaciones de E /S se realizan incluso si aún no se ha escrito un nuevo carácter de línea. El segundo es: siempre que desee obtener datos de entrada de (a) un flujo sin caché, o (b) un flujo con un caché de fila (que requiere datos del kernel por adelantado), entonces obtendrá datos de entrada de la biblioteca de entrada y salida estándar. Hace que se vacíen todos los flujos de salida de caché de fila. La razón para tener una descripción entre paréntesis en (b) es que los datos requeridos pueden estar ya en el caché, y no requiere que el kernel haga esto cuando se necesitan los datos. Obviamente, la entrada de un flujo sin un caché ((a)) requiere que los datos se obtengan del kernel en ese momento.
(3) Sin caché. Las bibliotecas de E /S estándar no almacenan caracteres en caché. Si escribe una cantidad de caracteres en un flujo sin un búfer usando una función de E /S estándar, es equivalente a escribir estos caracteres en el archivo abierto asociado usando la función de llamada al sistema w r i t e. El flujo de error estándar s t d e r r generalmente no está en caché, lo que permite que los mensajes de error se muestren lo antes posible, independientemente de si contienen un nuevo carácter de línea. ANSI C requiere las siguientes funciones de almacenamiento en caché: (1) Se almacenan en caché completamente si y solo si la entrada estándar y la salida estándar no implican un dispositivo de interacción.
(2) Los errores estándar nunca se almacenan completamente en caché. Sin embargo, esto no nos dice si la entrada y salida estándar involucran dispositivos ininterrumpidos, si se almacenan en caché o línea en caché, y si la salida estándar es sin caché o línea en caché. Los sistemas S V R 4 y 4. 3 + B S D utilizan los siguientes tipos de caché de forma predeterminada: • Los errores estándar no se almacenan en caché. • Si hay otras transmisiones involucradas en el dispositivo terminal, se almacenan en la caché de línea, de lo contrario se almacenan en caché completamente.

//****************************

*

Nosotros La entrada y salida estándar se usan a menudo, y ANSI C no impone las características de caché de stdin, stdout y stderr, por lo que diferentes sistemas pueden tener diferentes características de caché para stdin, stdout y stderr. Las principales características de la memoria caché son: stdin y stdout son buffers de línea; stderr no está en caché.


Copyright © Conocimiento de Windows All Rights Reserved