Anmelden

Archiv verlassen und diese Seite im Standarddesign anzeigen : mehrere filedeskriptoren gleichzeitig verwalten



mithras
13-10-2002, 17:02
folgendes Prob:

Hab 10 filedeskriptoren.

Nun muss ich rausfinden welcher dieser 10 fd's daten liefert, also von welchen ich lesen kann, anschließend muss ich von dem lesen, und die gelesenen daten an alle anderen fd's schicken.

ich weiß da gibt es die fkt. select() allerdings verstehe ich nicht so ganz wie man diese implementiert!

anda_skoa
13-10-2002, 18:21
Hi!

Die man page von select enthält ein Beispiel:


#include <stdio.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>

int
main(void) {
fd_set rfds;
struct timeval tv;
int retval;

/* Watch stdin (fd 0) to see when it has input. */
FD_ZERO(&rfds);
FD_SET(0, &rfds);
/* Wait up to five seconds. */
tv.tv_sec = 5;
tv.tv_usec = 0;

retval = select(1, &rfds, NULL, NULL, &tv);
/* Don't rely on the value of tv now! */

if (retval)
printf("Data is available now.\n");
/* FD_ISSET(0, &rfds) will be true. */
else
printf("No data within five seconds.\n");

return 0;
}


Wo gibt es da Unklarheiten, bei denen wir dir helfen könnten?

Ciao,
_

mithras
13-10-2002, 19:39
HI! Dank!
habe mich nochmal mit dem Thema beschäftigt, und das Bsp aus der manpage ist gut, ich glaub ich weiß jetzt wie das alles funtzt.:

ich füge einer Lesemenge fd's zu die überwacht werden sollen.
wenn einer der fd's daten bereit hält, also wenn er daten schicken könnte (lesebereit), gibt select eben diesen fd zurück, und ich kann von dem lesen!?!?

anda_skoa
13-10-2002, 20:09
Original geschrieben von mithras
ich füge einer Lesemenge fd's zu die überwacht werden sollen.
wenn einer der fd's daten bereit hält, also wenn er daten schicken könnte (lesebereit), gibt select eben diesen fd zurück, und ich kann von dem lesen!?!?

Das dachte ich auch, aber es gibt die Anzahl der FDs zurück, die gelesen werden l
können.

Beim genaueren Durchlesen der man page ist mir aufgefallen, dass dort auf eine weitere Manpage verweisen wird, die noch mehr Beispiele und erklärungen enthält
#> man select_tut

Dort wird dann auch erklrät, wie es funktioniert:


readfds
This set is watched to see if data is available for reading from
any of its file descriptors. After select has returned, readfds
will be cleared of all file descriptors except for those file
descriptors that are immediately available for reading with a
recv() (for sockets) or read() (for pipes, files, and sockets)
call.


D.h. dass select returned und wenn der Retourwert > 0 ist, enthält das fd_set alle FD, die bereit zum lesen sind.

Am besten du schaust dir select_tut auch noch an.

Ciao,
_