2010-10-21 9 views
0

J'utilise le programme suivant pour écrire un fifo:open() provoque la fin du programme

#include <iostream> 
#include <fstream> 

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <unistd.h> 
#include <fcntl.h> 
#include <sys/types.h> 
#include <sys/stat.h> 

using namespace std; 

int main() { 

    unlink("fifo1"); 

    if (mkfifo("fifo1", 0666) != 0) { 
     cout << "Error while creating fifo" << endl; 
     return 1; 
    } 
    else { 
     cout << "Fifo created" << endl; 
    } 

    int fd = open("fifo1", O_WRONLY); 
    if(fd == -1) { 
     cout << "Could not open file" << endl; 
     return 1; 
    } 
    else { 
     cout << "Fifo opened" << endl; 
    } 


    int i=0; 
    char* buffer = new char[20]; 
    while(true) { 
     sprintf(buffer, "look: %i\n", i++); 

     int r = write(fd, buffer, strlen(buffer)); 
     if(r == -1) { 
      cout << "Fifo Error:" << fd << endl; 
     } 
     else { 
      cout << "Wrote: " << i << "(" << r << "B)"<< endl; 
     } 
     sleep(1); 
    } 

    return 0; 
} 

Si je commence à ce programme, lancer un autre shell et tapez il

cat < fifo1 

Je peux voir que le programme écrit quelque chose sur le tuyau et je peux voir la sortie dans le shell de lecture. Si j'arrête la commande cat avec CTRL^C, le FIFO Writer se termine, sans message d'erreur. Quelle est la raison pour ça? Pourquoi aucune erreur n'est-elle lancée? La chose étrange est, si je commence le code ci-dessus avec Eclipse CDT et le shell de lecture est fermé avec CTRL^C le programme continue d'imprimer "Error: 3".

Nous attendons vos idées, heinrich

+0

C'est C++ mélangé avec C – nategoose

+0

Ceci est C mélangé avec C++ 's ' cout' –

+0

-1 pour poser des questions sur C mais en nous montrant le code C++. –

Répondre

3

Si vous écrivez à un tuyau lorsque l'autre extrémité du tube a été fermé un SIGPIPE sera livré à votre processus. Sans un gestionnaire de signal installé, cela va tuer votre processus immédiatement. Normalement, c'est la sortie, je ne sais pas pourquoi ne le vois pas.

Si vous soyez plutôt pour vérifier les codes d'erreur d'écriture que obtenir un SIGPIPE que votre code indique, vous devez ignorer SIGPIPE:

#include <signal.h> 

signal(SIGPIPE, SIG_IGN); 
+0

À partir de bash-3.1, bash ne signale pas les erreurs SIGPIPE par défaut. –

+0

@Alexandre, merci alors tout pourrait être expliqué maintenant –

+0

Merci pour la réponse, c'était le problème! – Erik

Questions connexes