freakystyley Δημοσ. 11 Σεπτεμβρίου 2006 Δημοσ. 11 Σεπτεμβρίου 2006 copy paste της άσκησης.. Στο επόμενο παράδειγμα η ανταλλαγή δεδομένων γίνεται από δύο ξεχωριστές διεργασίες. Το πρόγραμμα receiver δημιουργεί έναν επώνυμο σωλήνα και διαβάζει συνεχώς απʼ αυτόν μέχρι να παρα- λάβει τη λέξη “exit”. receiver.c >#include <string.h> #include <unistd.h> #include <fcntl.h> #include <sys/types.h> #include <sys/stat.h> int main() { int fd; char buffer[100]; unlink("FIFO"); if (mkfifo("FIFO", 0755) == -1){ fprintf(stderr,"Receiver: Coudn't create fifo.\n"); exit(2); } if ((fd = open("FIFO", O_RDWR)) == -1){ fprintf(stderr, "Receiver: fifo open failed.\n"); exit(1); } while(1){ if (read(fd, buffer, 100) == -1){ fprintf(stderr,"Receiver: fifo reading failed.\n"); exit(2); } printf("Received message: %s\n", buffer); if (!strcmp(buffer,"exit")) exit(0); } return 0; } Το πρόγραμμα sender καλείται με τουλάχιστον ένα όρισμα από τη γραμμή εντολών του Λ.Σ. και ανοίγει το σωλήνα με την επιλογή O_RDWR | O_NONBLOCK (γιατί;). Στη συνέχεια γράφει κάθε παράμετρο στο fifo. sender.c > #include <stdio.h> #include <string.h> #include <unistd.h> #include <fcntl.h> int main(int argc, char *argv[]){ int fd, i, n; char buffer[100]; if (argc < 2){ fprintf(stderr, "Usage: %s message ...\n", argv[0]); exit(1); } if ((fd = open("FIFO", O_RDWR | O_NONBLOCK)) == -1){ fprintf(stderr, "Sender: fifo open failed.\n"); exit(3); } for (i = 1; i < argc; i++){ strcpy(buffer, argv[i]); if ((n = write(fd, buffer, 100)) == -1){ fprintf(stderr, "Sender: Write to fifo failed.\n"); exit(4); } } return 0; } H ερώτηση λοιπόν είναι ποία η χρησιμότητα του O_NONBLOCK?? Δοκίμασα να το τρέξω και χωρίς την παράμετρο αυτήν και το αποτέλεσμα ήταν το ίδιο.. Κανείς που να γνωρίζει?? thanks alot:|
chiossif Δημοσ. 11 Σεπτεμβρίου 2006 Δημοσ. 11 Σεπτεμβρίου 2006 Η απάντηση είναι αυτή: O_NONBLOCK and O_WRONLY are both set in the flags argument, the file named by filename is a FIFO (see section Pipes and FIFOs), and no process has the file open for reading. και την βρήκα εδώ: http://www.ia.pw.edu.pl/~wujek/dokumentacja/gnu/libc/libc_8.html Συνοψίζω: εξασφαλίζει ότι δεν δουλεύει η "διασωλήνωση" και για κάποιον άλλον (δεν το ήξερα και εγώ τώρα το έμαθα...Thanks)
Sta Δημοσ. 11 Σεπτεμβρίου 2006 Δημοσ. 11 Σεπτεμβρίου 2006 Επειδή η συνάρτηση open() δεν περιλαμβάνεται στο ANSI/ISO πρότυπο της C, πρέπει να αναζητήσεις τις λεπτομέρειες της υλοποίησής της στο σύστημά σου, π.χ. με: man 2 open.
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.