The UNIX and Linux Forums  

Go Back   Les systèmes UNIX et Linux Forums > Top Forums > UNIX for Advanced & Expert Users
.
google unix.com



UNIX for Advanced & Expert Users Expert à Expert. Apprenez avancé UNIX, des commandes UNIX, Linux, les systèmes d'exploitation, d'administration système, de la Programmation, Shell, Shell Scripts, Solaris, Linux, HP-UX, AIX, OS X, BSD.

Plus d'UNIX et Linux Forum Sujets Vous trouverez peut-être utile
Fil Thread Starter Forum Réponses Last Post
Doutes sur FIFO Akshay UNIX pour les nuls Questions et réponses 0 06-06-2008 08:56 AM
comment utiliser fifo Atticus High Level Programming 3 06-05-2006 11:15 AM
FIFO question runawayNinja High Level Programming 1 04-29-2004 04:10 PM
FIFO par NFS saabir UNIX for Advanced & Expert Users 2 08-06-2003 09:03 AM
Pipe & fifo .... M3xican High Level Programming 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 Recherche sur ce Thread Rate Thread Modes d'affichage
  #1 (permalink)  
Old 06-30-2009
jackhab jackhab is offline
Registered User
  
 

Date d'inscription: juin 2009
Messages: 1
Puis file FIFO overfow?

Je tiens à la production d'informations de journalisation dans le fichier FIFO. Mon application peut fonctionner pendant des mois. Ma question est ce qui se passe à FIFO file quand il ya un côté constamment écrit à personne et de l'autre côté la lecture de tout ça?
Sera-t-il finalement coincé, de débordement, de réinitialisation, elle prendra toutes les OS de la RAM?

Merci.
  #2 (permalink)  
Old 06-30-2009
mgessner mgessner is offline
Registered User
  
 

Join Date: Oct 2007
Posts: 50
Eh bien, on pourrait imaginer un test assez simple.

Créer le FIFO w / mkfifo. Créer deux processus, un écrivain et un lecteur.

Ouvrez le FIFO pour écrire, ce qui permet de bloquer, car il n'y a pas de lecteur. Quand il débloque, écrire sur stderr qu'il est éveillé, et de temps en temps à écrire des octets, et vous connecter chaque écrire.

Lancer un processus de lecture, faites-le dormir un peu, et qu'ils l'aient lu, disons, 10 fois, ce qu'il lit dumping. Ensuite, il devrait fermer la fifo et fin.

Qu'est-ce que vous devriez voir, selon APUE Stevens, est que la cause devrait écrire SIGPIPE à générer.

Voici un exemple:

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

J'ai géré sur un couple de systèmes, et je suis sûr il ya des problèmes avec elle (par exemple, il ne faut pas utiliser un signal de fprintf gestionnaire ...).

Mais je pense que cela illustre bien ce point.
  #3 (permalink)  
Old 06-30-2009
jim McNamara jim mcnamara is offline Forum Staff  
...@...
  
 

Join Date: Feb 2004
Lieu: NM
Posts: 5805
FIFO's / tuyaux

Vous devez également savoir sur PIPE_BUF, le nombre minimum garanti d'octets qui peut être écrite. Les implémentations varient sur ce point.

Il n'y a pas de partie à l'écrit d'un tuyau lorsque la taille de la mémoire tampon est plus grand que l'espace disponible. Au lieu de -1 est retourné par écrit avec errno mis à EAGAIN.

Enfin, pour les hautes performances de messagerie ou de la CIB, pipes / FIFOs ne sont pas un bon choix.
Comme il n'existe pas de garantie de l'atomicité, plusieurs lecteurs sur un seul tuyau peut avoir des problèmes.

Dernière édition par Jim McNamara; au 06.30.2009 11:17 AM.. Motif: orthographe
  #4 (permalink)  
Old 06-30-2009
fpmurphy's Avatar
fpmurphy fpmurphy is offline Forum Staff  
Modérateur
  
 

Join Date: Dec 2003
Lieu: Florida
Posts: 1938
Selon POSIX.1-2008 écrire () , errno est fixé à EPIPE SIGPIPE et un signal est envoyé à l'appelant fil.
  #5 (permalink)  
Old 06-30-2009
jim McNamara jim mcnamara is offline Forum Staff  
...@...
  
 

Join Date: Feb 2004
Lieu: NM
Posts: 5805
J'ai été référencement Marc Rochkind 'Advanced Unix Programming' sec 6.2.2. Et POSIX - Je suppose nonblocking.


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

Je n'ai pas été clair.
Reply

Bookmarks

Thread Tools Recherche sur ce Thread
Recherche sur ce Thread:

Recherche avancée
Modes d'affichage Rate this thread
Rate this thread:

Règles de messages
Tu mai pas de nouvelles discussions: nonoui
Tu mai pas envoyer des réponses:
Tu mai pas envoyer des pièces jointes
Tu mai pas modifier vos messages

BB code est Sur
Smilies sont Sur
[IMG] code est Sur
Le code HTML est Hors tension
Trackbacks sont Sur
Pingbacks sont Sur
Refbacks sont Sur




Toutes les heures sont au format GMT -4. Le temps est maintenant 09:42 AM.


Powered by: vBulletin, Copyright © 2000 - 2006, Jelsoft Enterprises Limited. Traductions Langue Powered by .
vBCredits v1.4 Copyright © 2007 - 2008, PixelFX Studios
Les systèmes UNIX et Linux Forums Content Copyright © 1993-2009. Tous droits Reserved.Ad de gestion par RedTyger

Content Relevant URLs par vBSEO 3.2.0