![]() |
Hola y bienvenida de los Estados Unidos a la UNIX y Linux Foros! Gracias por su visita y formar parte de nuestra comunidad global.
|
|
google unix.com
|
|||||||
| Foros | Registro | Reglas de los Foros | Enlaces | Álbumes | Preguntas más frecuentes | Lista de miembros | Calendario | Búsqueda | Puestos de hoy | Marcar Foros Como Leídos |
| UNIX para usuarios avanzados y expertos Experto a experto. Aprender avanzada UNIX, los comandos de UNIX, Linux, Sistemas Operativos, Administración de Sistemas, Programación, Shell, Shell Scripts, Solaris, Linux, HP-UX, AIX, OS X, BSD. |
Más UNIX y Linux Foro Temas usted puede encontrar útiles
|
||||
| Hilo | Hilo para principiantes | Foro | Respuestas | Último mensaje |
| Dudas sobre FIFO | Akshay | UNIX for Dummies Preguntas y Respuestas | 0 | 06-06-2008 08:56 AM |
| cómo utilizar fifo | Atticus | Programación de Alto Nivel | 3 | 06-05-2006 11:15 AM |
| FIFO cuestión | runawayNinja | Programación de Alto Nivel | 1 | 04-29-2004 04:10 PM |
| FIFO sobre NFS | saabir | UNIX para usuarios avanzados y expertos | 2 | 08-06-2003 09:03 AM |
| Pipe & fifo .... | M3xican | Programación de Alto Nivel | 4 | 07-20-2002 08:22 AM |
![]() |
|
|
Linkback vínculo | Herramientas de hilo | Buscar en este Hilo | Tasa de Hilo | Modos de visualización |
|
|
|
||||
|
FIFO puede overfow archivo?
Quiero información de registro de salida en el archivo FIFO. Mi aplicación puede funcionar durante meses. Mi pregunta es qué sucede con el archivo FIFO cuando hay una cara constantemente a lo escrito, y nadie en el otro lado la lectura de ella?
¿Se acabó atascado, desbordamiento, a cero, va a tomar todos los sistemas operativos de RAM? Gracias. |
|
||||
|
Bueno, usted podría idear una prueba muy sencilla.
Crear la FIFO w / mkfifo. Crear dos procesos, un escritor y un lector. Abra el FIFO para escribir, lo que cuadra porque no hay ningún lector. Cuando se desbloquea, escriba a stderr que es despierto, y luego periódicamente a escribir algunos bytes, y de registro de cada escritura. Ejecutar un proceso lector, tienen que dormir un poco, y tienen que leer, por ejemplo, 10 veces, el vertido de lo que lee. Entonces debería cerrar el fifo y terminar. Lo que usted debe ver, según Stevens APUE, es que debe escribir la causa SIGPIPE a ser generado. He aquí un ejemplo: Código:
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <signal.h>
int sigpipe_caught = 0;
#define TESTLOG(s) testlog(__FUNCTION__, s)
void testlog (const char *who, const char *msg)
{
fprintf (stderr, "%s: %s\n", who, msg);
}
void writer (void)
{
int f;
int value = 0;
int err;
int done = 0;
TESTLOG ("starting");
if ((f = open ("fifo", O_WRONLY)) != -1)
{
TESTLOG ("opened fifo");
while (done <= 0)
{
char buf[64];
err = write (f, &value, sizeof value);
if (sizeof value == err)
{
sprintf (buf, "wrote %d", value);
TESTLOG (buf);
value++;
}
else
{
sprintf (buf, "err = %d", err);
TESTLOG (buf);
sprintf (buf, "sigpipe_caught = %d", sigpipe_caught);
TESTLOG (buf);
done++;
}
TESTLOG ("sleeping");
sleep (1);
}
close (f);
TESTLOG ("closed fifo");
}
}
void reader (void)
{
int f;
int i;
int value;
int err;
TESTLOG ("sleeping 2");
sleep (2);
TESTLOG ("awake");
if ((f = open ("fifo", O_RDONLY)) != -1)
{
TESTLOG ("opened fifo");
for (i = 0; i < 10; i++)
{
char buf[64];
err = read (f, &value, sizeof value);
if (sizeof value == err)
{
sprintf (buf, "read %d", value);
TESTLOG (buf);
}
else
{
sprintf (buf, "err = %d", err);
TESTLOG (buf);
}
}
TESTLOG ("closing fifo");
close (f);
}
else
{
TESTLOG ("failed to open fifo");
}
}
void sigpipe (int a)
{
TESTLOG ("caught SIGPIPE");
sigpipe_caught = 1;
}
int main (void)
{
signal (SIGPIPE, sigpipe);
if (fork())
writer();
else
reader();
return 0;
}
Pero creo que ilustra el punto. |
|
||||
|
FIFO's / tuberías
Usted también debe saber acerca de PIPE_BUF, el mínimo garantizado número de bytes que se pueden escribir. Implementaciones varían en ello. No hay parcial escribe a una tubería, cuando el pedido tamaño del búfer es mayor que el espacio disponible. -1 Es devuelto en lugar de escribir con errno ajustado a EAGAIN. Por último, para un alto rendimiento o de mensajería IPC, tuberías / FIFOs no son una gran opción. Porque no hay garantía de atomicidad, lectores múltiples en un solo tubo pueden tener problemas. Última edición por Jim McNamara; 06-30-2009 en 11:17 AM.. Motivo: hechizo |
|
|||||
|
Según POSIX.1 escribir-2008 () , errno está ajustado a EPIPE y SIGPIPE una señal es enviada a la convocatoria hilo.
|
|
||||
|
Me referencias Marc Rochkind 'Programación avanzada en UNIX' s 6.2.2. Y POSIX - Supongo nonblocking.
Código:
If O_NDELAY or O_NONBLOCK is set, the write returns -1 and
sets errno to [EAGAIN].
|
![]() |
| Marcadores |
| Herramientas de hilo | Buscar en este Hilo |
| Modos de visualización | Vota a este hilo |
|
|