2010-08-09 4 views
3

Je fais de la programmation en C++, sous LINUX. J'ai deux processus indépendants. Je devrais fournir la communication en utilisant le tuyau nommé.Canaux nommés - Problème avec write() et read()

lecteur: -Crée FIFO en utilisant mkfifo - status = mkfifo (myFIFO, 0666) -opens le tuyau à l'aide ouverte - fifo = open (myFIFO, O_RDONLY) -reads du tuyau - num = lecture (fifo, temp, sizeof (temp))

Écrivain: -ouverture du tube - fifo = ouvert (myFIFO, O_WRONLY); - écrit dans le tube - num = write (fifo, string, strlen (string));

J'ai remarqué que le descripteur de fichier retourné pour le processus de lecture et le processus d'écriture sont 0. Aussi, après l'écriture de la commande, je peux voir sur mon terminal, la chaîne qui doit être écrite sur le tube. Je ne sais pas pourquoi il est montré sur le terminal ... Aussi, le nombre d'octets qui sont écrits est 0 ...

Pourriez-vous m'aider s'il vous plaît? Merci!

// read.cpp: 

#define myFIFO "/temp/FIFO" 

int main(){ 
    int num, fifo, status; 
    char temp[32]; 

    if (status = mkfifo(myFIFO, 0666) < 0) { 
    printf("\n %s \n", strerror(errno)); 
    return 0; 
    } 

    if (fifo = open(myFIFO, O_RDONLY) < 0) { 
    printf("\n %s \n", strerror(errno)); 
    return 0; 
    } 

    if (num= read(fifo, temp, sizeof(temp)) < 0) { 
    printf("\n %s \n", strerror(errno)); 
    return 0; 
    } 

    printf("In FIFO is %s \n", temp); 
} 

Et dans un autre fichier:

// write.cpp: 

#define myFIFO "/temp/FIFO" 

int main() { 
    int status, num, fifo; 
    char string[]="Testing..."; 

    if (fifo = open(myFIFO, O_WRONLY) < 0) { 
    printf("\n %s \n", strerror(errno)); 
    return 0; 
    } 

    if (num= write(fifo, string, strlen(string)) < 0) { 
    printf("\n %s \n", strerror(errno)); 
    return 0; 
    } 
} 
+1

Pourriez-vous l'exécuter sous strace et publier les journaux? – jpalecek

+1

Veuillez écrire le code où le tuyau est nommé et ouvert, et où vous lisez/écrivez dessus. – James

+1

Postez votre code, il sera plus facile de vous aider lorsque nous pourrons voir votre problème. –

Répondre

1

Le problème est dans votre code: fifo = open(myFIFO, O_WRONLY) < 0 est évaluée comme fifo = (open(myFIFO, O_WRONLY) < 0). Vous obtenez zéro car la valeur open() renvoie >= 0.

+0

Merci beaucoup !!! J'ai perdu 3 jours parce que ... Maintenant, ça marche ... – MarijaS

7

Vous avez au moins quatre erreurs dans votre code. Lorsque vous créez une FIFO, vous devez utiliser un descripteur de fichier renvoyé par un appel "open". Cependant, vous comparez avec 0 et l'attribution d'un résultat d'une comparaison à une variable qui était destinée à contenir un descripteur de fichier:

if (fifo = open(myFIFO, O_RDONLY) < 0) { 
    printf("\n %s \n", strerror(errno)); 
    return 0; 
} 

Le code correct devrait ressembler à ceci:

fifo = open(myFIFO, O_RDONLY); 
if (fifo < 0) { 
    printf("\n %s \n", strerror(errno)); 
    return 0; 
} 

Ou comme ça, si vous insistez d'économiser une ligne de code:

if ((fifo = open(myFIFO, O_RDONLY)) < 0) { 
    printf("\n %s \n", strerror(errno)); 
    return 0; 
} 

Et exactement la même histoire avec la lecture:

if (num= read(fifo, temp, sizeof(temp)) < 0) { 
    printf("\n %s \n", strerror(errno)); 
    return 0; 
} 

code correct:

num = read(fifo, temp, sizeof(temp)); 
if (num < 0) { 
    printf("\n %s \n", strerror(errno)); 
    return 0; 
} 

Dans votre code qui écrit FIFO il exactement les deux mêmes erreurs.

+0

Vous avez absolument raison! Je cherchais une erreur, mais je n'ai pas vu cette chose ... De toute évidence, je dois pratiquer de plus en plus ... Merci !!! – MarijaS

+0

@MarijaS De rien. Tout est dans l'ordre de l'évaluation. Cela viendra naturellement avec l'expérience. Je vous recommande de ne pas essayer d'enregistrer une ligne de code pendant que vous apprenez :-) –

Questions connexes