The UNIX and Linux Forums  
Hola y bienvenida de los Estados Unidos a la UNIX y Linux Foros! Gracias por su visita y formar parte de nuestra comunidad global.

Go Back   El UNIX y Linux Foros > Arriba Foros > UNIX para usuarios avanzados y expertos
.
google unix.com



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

Reply
English Japanese Spanish French German Portuguese Italian Dutch Swedish Russian Norwegian Hungarian Hebrew Danish Bulgarian Greek Powered by Powered by Google
 
Linkback vínculo Herramientas de hilo Buscar en este Hilo Tasa de Hilo Modos de visualización
  #1 (Enlace permanente)  
Old 06-30-2009
jackhab jackhab is offline
Usuario Registrado
  
 

Fecha: junio 2009
Publicaciones: 1
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.
  #2 (Enlace permanente)  
Old 06-30-2009
mgessner mgessner is offline
Usuario Registrado
  
 

Fecha: octubre 2007
Puestos: 50
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;
}
He ejecutar esta en un par de sistemas, y estoy seguro de que hay problemas con él (por ejemplo, uno no debe usar fprintf de un manejador de la señal ...).

Pero creo que ilustra el punto.
  #3 (Enlace permanente)  
Old 06-30-2009
Jim McNamara jim mcnamara is online now Forum Staff  
...@...
  
 

Fecha: febrero 2004
Ubicación: NM
Mensajes: 5.762
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
  #4 (Enlace permanente)  
Old 06-30-2009
fpmurphy's Avatar
fpmurphy fpmurphy is offline Forum Staff  
Moderador
  
 

Fecha: diciembre 2003
Ubicación: Florida
Mensajes: 1.927
Según POSIX.1 escribir-2008 () , errno está ajustado a EPIPE y SIGPIPE una señal es enviada a la convocatoria hilo.
  #5 (Enlace permanente)  
Old 06-30-2009
Jim McNamara jim mcnamara is online now Forum Staff  
...@...
  
 

Fecha: febrero 2004
Ubicación: NM
Mensajes: 5.762
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].
Yo no estaba claro.
Reply

Marcadores

Herramientas de hilo Buscar en este Hilo
Buscar en este Hilo:

Búsqueda avanzada
Modos de visualización Vota a este hilo
Vota a este hilo:

Normas de envío
puede que no nuevo puesto de hilos
puede que no enviar respuestas
puede que no enviar archivos adjuntos
puede que no editar sus puestos

Código BB es Encendido
Emoticones son Encendido
[IMG] código Encendido
Código HTML es Apagado
Trackbacks son Encendido
Pingbacks son Encendido
Refbacks son Encendido




Todas las horas son GMT -4. La hora es 03:48 PM.


Powered by: vBulletin, Copyright © 2000 - 2006, Jelsoft Enterprises Limited. Traducciones de idiomas Powered by .
vBCredits v1.4 Copyright © 2007 - 2008, PixelFX Estudios
El UNIX y Linux Foros Contenido Copyright © 1993-2009. Todos los derechos Reserved.Ad Gestión por RedTyger

Las direcciones URL de contenido vBSEO 3.2.0