The UNIX and Linux Forums  

Go Back   De Unix-en Linux Forum > Top Forums > UNIX for Advanced & Expert Gebruikers
.
google unix.com



UNIX for Advanced & Expert Gebruikers Expert-to-Expert. Hier geavanceerde UNIX-, UNIX-commando's, Linux, Operating Systems, System Administration, programmering, Shell, Shell scripts, Solaris, Linux, HP-UX, AIX, OS X, BSD.

Meer UNIX en Linux Forum Onderwerpen Misschien vindt u Helpful
Draad Thread Starter Forum Antwoorden Last Post
Twijfels over FIFO Akshay UNIX voor Dummies Questions & Answers 0 06-06-2008 08:56
hoe te gebruiken fifo ATTICUS Hoog Niveau Programmering 3 06-05-2006 11:15
FIFO kwestie runawayNinja Hoog Niveau Programmering 1 04-29-2004 04:10 PM
FIFO over NFS saabir UNIX for Advanced & Expert Gebruikers 2 08-06-2003 09:03
Pipe & fifo .... M3xican Hoog Niveau Programmering 4 07-20-2002 08:22

Reply
English Japanese Spanish French German Portuguese Italian Dutch Swedish Russian Norwegian Hungarian Hebrew Danish Bulgarian Greek Powered by Powered by Google
 
LinkBack Thread Tools Zoeken in deze Thread Rate Thread Display Modes
  #1 (permalink)  
Old 06-30-2009
jackhab jackhab is offline
Geregistreerde gebruiker
  
 

Join Date: juni 2009
Krabbels: 1
Kan FIFO bestand overfow?

Ik wil de output logger informatie in FIFO bestand. Mijn toepassing kan worden uitgevoerd voor maanden. Mijn vraag is wat er gebeurt met FIFO bestand wanneer er sprake is van een kant voortdurend te schrijven en niemand aan de andere kant het lezen van het?
Zal het uiteindelijk vast, overloopkanalen, reset, zal het nemen van alle OS's RAM-geheugen?

Bedankt.
  #2 (permalink)  
Old 06-30-2009
mgessner mgessner is offline
Geregistreerde gebruiker
  
 

Join Datum: oktober 2007
Posts: 50
Nou, je zou kunnen bedenken een test redelijk eenvoudig.

Maak de FIFO w / mkfifo. Maak twee processen, een schrijver en een lezer.

Open het FIFO voor schrijven, dat zal blokkeren omdat er geen lezer. Wanneer het unblocks, schrijven naar stderr dat het wakker, en daarna periodiek schrijven enkele bytes is, en meldt elke schrijven.

Voer een lezer proces, hebben ze een beetje slapen, en hebben zij lezen, zeg, 10 keer, dumpen wat hij leest. Dan moet het sluiten van de fifo en beëindigen.

Wat u zou moeten zien, volgens Stevens APUE, is dat de afschrijving mag SIGPIPE worden gegenereerd.

Hier is een voorbeeld:

Code:
#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;
}

Ik heb dit op een paar van de systemen, en ik ben er zeker van dat er problemen met het (bijvoorbeeld een niet moeten gebruiken fprintf uit een signaal handler ...).

Maar ik denk dat het illustreert het punt.
  #3 (permalink)  
Old 06-30-2009
jim McNamara jim mcnamara is offline Forum Staff  
...@...
  
 

Join Date: Feb 2004
Locatie: NM
Berichten: 5.807
FIFO's / buizen

U moet ook weten PIPE_BUF, de gegarandeerde minimum aantal bytes dat kan worden geschreven. Implementaties variëren op dit punt.

Er zijn geen gedeeltelijke schrijft aan een pijp, wanneer de gevraagde grootte van de buffer is groter dan de beschikbare ruimte. In plaats -1 geretourneerd door schrijven met errno ingesteld op EAGAIN.

Tenslotte wordt voor hoge prestaties messaging of IPC, pijpen / FIFOs niet een goede keuze.
Omdat er geen garantie van atomiciteit, meerdere lezers op een enkele pijp kunnen onderwerpen.

Laatst gewijzigd door Jim McNamara; op 06.30.2009 11:17.. Reden: spelling
  #4 (permalink)  
Old 06-30-2009
fpmurphy's Avatar
fpmurphy fpmurphy is offline Forum Staff  
Moderator
  
 

Join Date: december 2003
Locatie: Florida
Berichten: 1.941
Volgens POSIX.1-2008 write () , errno is ingesteld op EPIPE en een SIGPIPE signaal wordt verstuurd naar de oproepende draad.
  #5 (permalink)  
Old 06-30-2009
jim McNamara jim mcnamara is offline Forum Staff  
...@...
  
 

Join Date: Feb 2004
Locatie: NM
Berichten: 5.807
Ik was verwijzingspagina Marc Rochkind 'Advanced UNIX Programming "sec 6.2.2. En POSIX - Ik neem nonblocking.


Code:
If O_NDELAY or O_NONBLOCK is set, the write returns -1 and
              sets errno to [EAGAIN].

Ik was niet duidelijk.
Reply

Bladwijzers

Thread Tools Zoeken in deze Thread
Zoeken in deze Thread:

Uitgebreid zoeken
Display Modes Beoordeel deze draad
Beoordeel deze draad:

Posting Regels
Jij mag niet Post Nieuwe threads
Jij mag niet na antwoorden
Jij mag niet post attachments
Jij mag niet bewerk uw berichten

BB code is Aan
Smilies zijn Aan
[IMG] code Aan
HTML-code is Uit
Trackbacks zijn Aan
Pingbacks zijn Aan
Refbacks zijn Aan




Alle tijden zijn GMT -4. Het is nu 02:12.


Powered by: vBulletin, Copyright © 2000 - 2006, Jelsoft Enterprises Limited. Vertalingen Powered by .
vBCredits v1.4 Copyright © 2007 - 2008, PixelFX Studios
De Unix-en Linux Forums Copyright © 1993-2009. Alle rechten Reserved.Ad Beheer door RedTyger

Content Relevante URL's door vBSEO 3.2.0