Πρόβλημα με fifo αρχεία

Συζητήσεις για την γλώσσα C και C++

Συντονιστές: WebDev Moderators, Super-Moderators

Απάντηση
dynoroad
Δημοσιεύσεις: 44
Εγγραφή: 13 Νοέμ 2008 00:09

Πρόβλημα με fifo αρχεία

Δημοσίευση από dynoroad » 13 Νοέμ 2008 16:26

Έχω τα εξής 2 παραδείγματα με τις αντίστοιχες εκφωνήσεις :

Στο επόμενο παράδειγμα η ανταλλαγή δεδομένων γίνεται από δύο
ξεχωριστές διεργασίες. Το πρόγραμμα receiver δημιουργεί έναν
επώνυμο σωλήνα και διαβάζει συνεχώς απ’ αυτόν μέχρι να παρα-
λάβει τη λέξη "exit".

receiver.c


#include <stdio.h>
#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);
if ((n = write(fd, buffer, 100)) == -1){
fprintf(stderr, "Sender: Write to fifo failed.\n");
exit(4);
}
}
return 0;
}



Αυτό που δεν έχωκαταλάβει είναι οτι ενώ το τρέχω στο μεν πρώτο δεν μου εμφανίζει τίποτα ενώ στο δεύτερο μου εμφανίζει το μήνημα που του προτρέπω να μου εμφανίσει... Ίσως να μην έχω καταλάβει σωστά αλλά δεν ξέρω ακόμα πως επικοινωνούν αυτά τα 2 αρχεία μεταξύ τους κ πώς μπορώ να γράψω κα΄τι στο ένα και να το εμφανίζει το άλλο...

dynoroad
Δημοσιεύσεις: 44
Εγγραφή: 13 Νοέμ 2008 00:09

Πρόβλημα με fifo αρχεία

Δημοσίευση από dynoroad » 14 Νοέμ 2008 01:12

Μια μικρή βοήθεια παιδιά κ δεν μπορώ ακόμα να βγάλω άκρη..... :cry:

Άβαταρ μέλους
bxenos
Δημοσιεύσεις: 53
Εγγραφή: 18 Αύγ 2008 19:56

Πρόβλημα με fifo αρχεία

Δημοσίευση από bxenos » 15 Νοέμ 2008 01:17

λίγο συμάζεμα (με τα NUL) και λειτουργεί. Για το NONBLOCK διάβασε αυτό http://cr.yp.to/unix/nonblock.html και αυτό http://linux.die.net/man/3/mkfifo

Κώδικας: Επιλογή όλων

#include <stdio.h> 
#include <string.h> 
#include <unistd.h> 
#include <fcntl.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
int main&#40;&#41; &#123; 
	int fd; 
	char buffer&#91;100&#93;; 
	unlink&#40;"FIFO"&#41;; 
	if &#40;mkfifo&#40;"FIFO", 0755&#41; == -1&#41;&#123; 
		fprintf&#40;stderr,"Receiver&#58; Coudn't create fifo.\n"&#41;; 
		exit&#40;2&#41;; 
	&#125; 
	if &#40;&#40;fd = open&#40;"FIFO", O_RDWR&#41;&#41; == -1&#41;&#123; 
		fprintf&#40;stderr, "Receiver&#58; fifo open failed.\n"&#41;; 
		exit&#40;1&#41;; 
	&#125; 
	while&#40;1&#41;&#123; 
		memset&#40;buffer,0,sizeof&#40;buffer&#41;&#41;;
		if &#40;read&#40;fd, buffer, 100&#41; == -1&#41;&#123; 
			fprintf&#40;stderr,"Receiver&#58; fifo reading failed.\n"&#41;; 
			exit&#40;2&#41;; 
		&#125; 
		printf&#40;"Received message&#58; %s\n", buffer&#41;; 
		if &#40;!strcmp&#40;buffer,"exit"&#41;&#41; 
			break; 
	&#125; 
	return 0; 
&#125;

Κώδικας: Επιλογή όλων

#include <stdio.h> 
#include <string.h> 
#include <unistd.h> 
#include <fcntl.h> 
int main&#40;int argc, char *argv&#91;&#93;&#41;&#123; 
	int fd, i, n; 
	char buffer&#91;100&#93;; 
	if &#40;argc < 2&#41;&#123; 
		fprintf&#40;stderr, "Usage&#58; %s message ...\n", argv&#91;0&#93;&#41;; 
	exit&#40;1&#41;; 
	&#125; 
	if &#40;&#40;fd = open&#40;"FIFO", O_RDWR | O_NONBLOCK&#41;&#41; == -1&#41;&#123; 
		fprintf&#40;stderr, "Sender&#58; fifo open failed.\n"&#41;; 
		exit&#40;3&#41;; 
	&#125; 
	for &#40;i = 1; i < argc; i++&#41;&#123; 
		memset&#40;buffer,0,sizeof&#40;buffer&#41;&#41;;
		strcpy&#40;buffer, argv&#91;i&#93;&#41;;
		if &#40;&#40;n = write&#40;fd, buffer, 100&#41;&#41; == -1&#41;&#123;
			fprintf&#40;stderr, "Sender&#58; Write to fifo failed.\n"&#41;; 
			exit&#40;4&#41;; 
		&#125; 
	&#125; 
	return 0; 
&#125;

Απάντηση

Επιστροφή στο “C, C++”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες