The UNIX and Linux Forums  

Go Back   Die UNIX-und Linux-Foren > Top Foren > UNIX für Fortgeschrittene und Experten
.
Google unix.com



UNIX für Fortgeschrittene und Experten Expert-to-Experte. Erfahren Sie fortgeschrittene UNIX-, UNIX-Kommandos, Linux-Betriebssysteme, System-Administration, Programmierung, Shell, Shell-Skripte, Solaris, Linux, HP-UX, AIX, OS X, BSD.

Mehr UNIX-und Linux-Forum Themen Vielleicht finden Sie hilfreiche
Faden Thread Starter Forum Antworten Last Post
Zweifel über die FIFO - Akshay UNIX for Dummies Questions & Answers 0 06-06-2008 08:56 AM
die Verwendung von fifo Atticus High-Level-Programmierung 3 06-05-2006 11:15 AM
FIFO-Problem runawayNinja High-Level-Programmierung 1 04-29-2004 04:10 PM
FIFO über NFS saabir UNIX für Fortgeschrittene und Experten 2 08-06-2003 09:03 AM
Pipe & fifo .... M3xican High-Level-Programmierung 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 Suche diesen Thread Rate Thread Anzeige-Modi
  #1 (permalink)  
Old 06-30-2009
jackhab jackhab is offline
Registrierte Nutzer
  
 

Join Date: Jun 2009
Beiträge: 1
Kann FIFO-Datei overfow?

Ich möchte, dass die Ausgabe von Informationen in FIFO-Logger-Datei. Meine Anwendung kann für die Monate. Meine Frage ist, was mit FIFO-Datei, wenn es die eine Seite ständig schriftlich an sie und niemand auf der anderen Seite Lesung von ihm?
Wird es schließlich stecken, Überlauf, setzen, wird es dauern, alle Betriebssysteme RAM?

Danke.
  #2 (permalink)  
Old 06-30-2009
mgessner mgessner is offline
Registrierte Nutzer
  
 

Join Date: Oct 2007
Beiträge: 50
Nun, Sie könnten, eine Prüfung ziemlich einfach.

Legen Sie die FIFO-w / mkfifo. Erstellen Sie zwei Verfahren, ein Schriftsteller und ein Lesegerät.

Öffnen Sie das FIFO zum Schreiben, die blockiert, weil es keine Leser. Wenn es unblocks, schreiben Sie an stderr, dass es wach ist, und dann in regelmäßigen Abständen einige Bytes zu schreiben, und jedes Protokoll schreiben.

Führen Sie einen Leser-Prozess, haben sie ein wenig schlafen, und sie lesen, sagen wir, 10-mal, Dumping, was es liest. Dann sollte das FIFO und beenden.

Was sollten Sie, je nach Stevens APUE, ist, dass die Ursache SIGPIPE schreiben sollte, um erzeugt werden.

Hier ein Beispiel:

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

Ich habe dies auf eine Reihe von Systemen, und ich bin sicher, es gibt Probleme mit (zum Beispiel, sollte man nicht verwenden, fprintf von einem Signal-Handler ...).

Aber ich glaube, es zeigt den Punkt.
  #3 (permalink)  
Old 06-30-2009
Jim McNamara jim mcnamara is offline Forum Staff  
...@...
  
 

Join Date: Feb 2004
Ort: NM
Posts: 5805
FIFO's / Rohre

Sie sollten auch wissen, über PIPE_BUF, die garantierte minimale Anzahl von Bytes, die geschrieben werden können. Implementierungen sind zu diesem Thema.

Es gibt keine teilweise schreibt an einem Rohr, wenn die beantragte Größe der Puffer ist größer als verfügbaren Speicherplatz. Statt -1 zurück schreiben mit errno auf EAGAIN.

Schließlich, für hohe Leistung Messaging oder IPC, Rohre / FIFOs sind keine gute Wahl.
Da gibt es keine Garantie für die Atomisierung, mehrere Leser über eine einzige Leitung können Probleme haben.

Zuletzt bearbeitet von Jim McNamara; am 06-30-2009 11:17 AM.. Grund: Rechtschreibung
  #4 (permalink)  
Old 06-30-2009
fpmurphy's Avatar
fpmurphy fpmurphy is offline Forum Staff  
Moderator
  
 

Join Date: Dezember 2003
Ort: Florida
Beiträge: 1938
Nach POSIX.1-2008 write () , errno ist auf EPIPE und SIGPIPE Signal wird an die aufrufende Thread.
  #5 (permalink)  
Old 06-30-2009
Jim McNamara jim mcnamara is offline Forum Staff  
...@...
  
 

Join Date: Feb 2004
Ort: NM
Posts: 5805
Ich war referenzierenden Marc Rochkind "Advanced UNIX Programming 's 6.2.2. Und POSIX - Ich gehe davon aus nonblocking.


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

Ich war mir nicht klar.
Reply

Lesezeichen

Thread Tools Suche diesen Thread
Suche diesen Thread:

Erweiterte Suche
Anzeige-Modi Rate this thread
Rate this thread:

Forumregeln
Du möglicherweise nicht neue Themen
Du möglicherweise nicht nach Antworten
Du möglicherweise nicht post-Anlagen
Du möglicherweise nicht bearbeiten Sie Ihre Beiträge

BB-Code ist Auf
Smilies sind Auf
[IMG] Code Auf
HTML-Code ist Aus
Trackbacks sind Auf
Pingbacks sind Auf
Refbacks sind Auf




Alle Zeiten sind GMT -4. Es ist jetzt 11:04 PM.


Powered by: vBulletin, Copyright © 2000 - 2006, Jelsoft Enterprises Ltd. Sprachliche Übersetzungen Powered by .
vBCredits v1.4 Copyright © 2007 - 2008, PixelFX Studios
Die UNIX-und Linux-Foren Content © Copyright 1993-2009. Alle Rechte Reserved.Ad Management von RedTyger

Content Relevant URLs durch vBSEO 3.2.0