Προς το περιεχόμενο

Ποια η χρησιμότητα της παραμέτρου?? C program...


freakystyley

Προτεινόμενες αναρτήσεις

Δημοσ.

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:|

Δημοσ.

Η απάντηση είναι αυτή:

 

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)

Δημοσ.

Επειδή η συνάρτηση open() δεν περιλαμβάνεται στο ANSI/ISO πρότυπο της C, πρέπει να αναζητήσεις τις λεπτομέρειες της υλοποίησής της στο σύστημά σου, π.χ. με: man 2 open.

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...