Pipe Broken, το αρχείο FIFO

ψήφοι
45

Προσπαθώ ένα πρόγραμμα για να χρησιμοποιήσετε το αρχείο FIFO, αλλά παίρνω Broken σωλήνα ως έξοδο. Εδώ είναι ο κώδικας -

#include<iostream>
#include<stdlib.h>
#include<fcntl.h>
#include<stdio.h>
#include<string.h>
#include<unistd.h>
#include<sys/stat.h>
#include<sys/types.h>
using namespace std;
int main(int argc,char *argv[])
{
int fd; //stores file descriptor returnd from open
char buf[256];
if(argc<2||argc>3)
{
    cout<<Invalid Arguments;
    return 1;
}

mkfifo(argv[1],0777);
if(argc==3)
{   
    cout<<Writer\n;
    if((fd=open(argv[1],O_WRONLY))==-1)
    {
        perror(open);
        return 1;
    }
    write(fd,argv[2],strlen(argv[2]));
    sleep(10);
}
else
{   cout<<Reader\n;
    if((fd=open(argv[1],O_RDONLY|O_NONBLOCK))==-1)
    {       
        perror(open);
        return 1;
    }

    read(fd,&buf,sizeof(buf));
    cout<<buf;

}
 close(fd);
 return 1;
 }

Έξοδος: Κάτω Fifo είναι το όνομα του αρχείου και Γεια σας είναι το περιεχόμενο.

./a.out fifo hello &

Writer

./a.out fifo
Reader

[1]+  Broken pipe  

Θα πρέπει να πάρετε «Hello» ως την έξοδο. Μπορεί κανείς να βοηθήσει;

Δημοσιεύθηκε 16/03/2016 στις 17:02
χρήστη
Σε άλλες γλώσσες...                            


2 απαντήσεις

ψήφοι
1

εγγραφής σας συμβεί πριν ξεκινήσετε τον αναγνώστη σας. Όταν γράφετε σε ένα σωλήνα και δεν έχει καμία αναγνώστη έχετε SIGPIPE.

Σε αυτό το συγκεκριμένο σχέδιο, θα πρέπει να χειριστεί SIGPIPE με τη λογική επανάληψης.

Απαντήθηκε 16/03/2016 στις 17:13
πηγή χρήστη

ψήφοι
1

Το σφάλμα που παίρνετε είναι EPIPEκαι αν διαβάσετε ένα writeεγχειρίδιο, θα δείτε ότι μπορείτε να πάρετε EPIPE, όταν

fd είναι συνδεδεμένο με ένα σωλήνα ή υποδοχή του οποίου το άκρο είναι κλειστό ανάγνωση.

Μπορείτε να πάρετε αυτό το λάθος, γιατί ανοίγετε το τέλος ανάγνωση του σωλήνα σε non-blocking λειτουργία, που σημαίνει ότι η readκλήση δεν θα εμποδίσει και να περιμένουν για τα δεδομένα που πρέπει να λαμβάνονται, αντί όταν η readκλήση να επιστρέψει αμέσως το κλείσιμο του σωλήνα και έξοδο από τη διαδικασία.

Αυτό σημαίνει ότι κατά την εκτέλεση του συγγραφέα δεν υπάρχει κανείς να περιμένει για τα δεδομένα που γράφετε και μπορείτε να πάρετε το σφάλμα.

Θα πρέπει να εκτελέσετε την ανάγνωση και τη συγγραφέα με αντίστροφη σειρά: πρώτα το συγγραφέα γι 'αυτό γράφει στο σωλήνα, και στη συνέχεια τον αναγνώστη να διαβάσει τα δεδομένα από το σωλήνα.

Απαντήθηκε 16/03/2016 στις 17:14
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more