The UNIX and Linux Forums  

Go Back   UNIX og Linux Forums > Top Forums > UNIX for Advanced & Ekspertsøgning Brugere
.
google unix.com



UNIX for Advanced & Ekspertsøgning Brugere Expert-til-ekspert. Lær avancerede UNIX, UNIX-kommandoer, Linux operativsystemer, systemadministration, programmering, Shell, Shell Scripts, Solaris, Linux, HP-UX, AIX, OS X, BSD.

Mere UNIX og Linux Forum Emner du måske kan finde Helpful
Tråd Thread Starter Forum Svar Last Post
Tvivl om FIFO Akshay UNIX for dummyer Spørgsmål & svar 0 06-06-2008 08:56 AM
hvordan man bruger FIFO atticus Højtstående Programmering 3 06-05-2006 11:15 AM
FIFO spørgsmål runawayNinja Højtstående Programmering 1 04-29-2004 04:10 PM
FIFO over NFS saabir UNIX for Advanced & Ekspertsøgning Brugere 2 08-06-2003 09:03 AM
Pipe & FIFO .... M3xican Højtstående Programmering 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 Thread Tools Søg denne tråd Rate Thread Display Modes
  #1 (permalink)  
Old 06-30-2009
jackhab jackhab is offline
Registreret Bruger
  
 

Join Date: Jun 2009
Stillinger: 1
Kan FIFO fil overfow?

Jeg vil gerne output logger oplysninger i FIFO fil. Min ansøgning kan køre i flere måneder. Mit spørgsmål er, hvad der sker med FIFO-fil, når der er en side konstant skriftligt til det, og ingen på den anden side at læse det?
Vil det i sidste ende stå, overflow, nulstillet, vil det tage alle OS's RAM?

Tak.
  #2 (permalink)  
Old 06-30-2009
mgessner mgessner is offline
Registreret Bruger
  
 

Join Date: oktober 2007
Stillinger: 50
Nå, du kan udtænke en test temmelig enkelt.

Opret FIFO w / mkfifo. Opret to processer, en forfatter og en læser.

Åbn FIFO for skrive, som vil blokere for, fordi der ingen læser. Når det unblocks, skrive til Stderr, at den er vågen, og derefter med jævne mellemrum skrive nogle bytes til det og logføre hvert skrive.

Kør en læser, har det sove lidt, og få den læst, sige 10 gange, dumpning, hvad det hedder. Så det bør lukke FIFO og afslutte.

Hvad du skal se, ifølge Stevens APUE, er at skrive bør medføre SIGPIPE skal frembringes.

Her er et eksempel:

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;
}

Jeg har køre dette på et par af systemer, og jeg er sikker på, at der er problemer med det (for eksempel, bør man ikke bruge fprintf fra et signal handling ...).

Men jeg synes, det illustrerer det punkt.
  #3 (permalink)  
Old 06-30-2009
jim McNamara jim mcnamara is offline Forum Staff  
...@...
  
 

Join Date: Feb 2004
Beliggenhed: NM
Indlæg: 5.808
FIFO's / rør

Du skal også vide om PIPE_BUF, den garanterede mindste antal bytes, der kan skrives. Implementations variere på dette.

Der er ingen delvise skriver til en rørledning, når den ønskede størrelse på buffer er større end pladsen. I stedet -1 returneres ved skrive med errno indstillet til EAGAIN.

Endelig er for høj ydeevne messaging eller IPC, rør / FIFOs er ikke et godt valg.
Fordi der ikke er nogen garanti for Atomicity, flere læsere på en enkelt pibe kan have problemer.

Senest redigeret af Jim McNamara; 06-30-2009 på 11:17 AM.. Årsag: stave
  #4 (permalink)  
Old 06-30-2009
fpmurphy's Avatar
fpmurphy fpmurphy is offline Forum Staff  
Moderator
  
 

Join Date: Dec 2003
Beliggenhed: Florida
Stillinger: 1945
Ifølge POSIX.1-2008 skriver () , errno er indstillet til EPIPE og en SIGPIPE signal er sendt til den kaldende tråd.
  #5 (permalink)  
Old 06-30-2009
jim McNamara jim mcnamara is offline Forum Staff  
...@...
  
 

Join Date: Feb 2004
Beliggenhed: NM
Indlæg: 5.808
Jeg var henvisninger Marc Rochkind 'Avanceret UNIX Programmering' sec 6.2.2. Og POSIX - Jeg formoder nonblocking.


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

Jeg var ikke klar.
Reply

Bogmærker

Thread Tools Søg denne tråd
Søg denne tråd:

Avanceret søgning
Display Modes Bedøm denne tråd
Bedøm denne tråd:

Udstationering Regler
Du kan ikke post nye tråde
Du kan ikke post svar
Du kan ikke post vedhæftede filer
Du kan ikke redigere dine indlæg

BB-kode er
Smilies er
[IMG] koden er
HTML-koden er Slukket
Trackbacks er
Pingbacks er
Refbacks er




Alle tidspunkter er GMT -4. Den tid er nu 08:11 PM.


Powered by: vBulletin, Copyright © 2000 - 2006, Jelsoft Enterprises Limited. Oversættelser Powered by .
vBCredits v1.4 Copyright © 2007 - 2008, PixelFX Studios
UNIX og Linux Forums Content Copyright © 1993-2009. Alle rettigheder Reserved.Ad Management ved RedTyger

Content Relevant webadresser ved vBSEO 3.2.0