poll(), epoll() etc.
-
@Caipirinha
was du mir mit diesem link sagen willst, weiß ich leider nicht.
Caipirinha schrieb:
Epoll_wait lässt man die maximale Zahl an events ausgeben
das geht nicht. man kann das epoll_wait nicht machen "lassen", da es nach einer bestimmten zeit von selbst zurückkehrt. bedenke sonst das problem, dass sich maxevents clients zuerst verbinden müssen, bevor du den ersten behandelst.
sonst könnte ich nicht sehen, welchen vorteil deine methode hat. du hast etwas, was du lock nennst, ich eine semaphore. das ist das gleiche. das einzige, was du dir sparst, ist das einfügen in die warteschlange. das ist aber O(1) und selbst bei extrem ausgelasteten servern bedeutungslos.
Marc21Ja schrieb:
...bedeutet das, dass wenn mehr als 16 oder 128 gleichzeitige Ereignisse stattfinden, der Kernel dann 16/128 Ereignisse ausgibt und beim nächsten Aufruf von epoll_wait merkt, es sind noch nicht alle Ereignisse ausgegeben und sofort zurück kehrt, um mit jeder Rückkehr 16/128 der restlichen Ereignisse zu liefern?
so ist es.
Marc21Ja schrieb:
Noch eine kleine Frage: Wenn ich einen fd schließe, muss ich nicht EPOLL_CTL_DEL aufrufen, sondern epoll entfernt den fd aus den Events automatisch, wenn ich den Socket mit close(c) z.B. aus einem anderen Thread schließe oder?
auch hier: so ist es.
-
Moin,
Ich bin neu auf den Foren hier, wies ausschaut passt mein Problem(chen) hier rein.Ich hab ein Serverprogramm geschrieben, welches auf einem Ubuntu 8.04 (64bit) läuft. Selbiges benutzt epoll mit nichtblockierenden Sockets. Hinzugefügte Sockets werden konfiguriert mit der Eventmaske EPOLLIN | EPOLLET | EPOLLONESHOT :
epoll_event ev;
ev.events = EPOLLIN | EPOLLET | EPOLLONESHOT;
if (epoll_ctl(epfd,EPOLL_CTL_ADD,iSocket,&ev)<0);
{...
das funktioniert fehlerfrei.Die Daten werden dann aus dem Socket gelesen. Vor der Verarbeitung setze ich erneut eine Eventmaske (da die Reaktivierung aus einem anderen thread stattfindet) :
epoll_event ev;
ev.events = EPOLLIN | EPOLLET | EPOLLONESHOT;
if (epoll_ctl(epfd,EPOLL_CTL_MOD,iSocket,&ev)<0)
{...Hierbei gibt epoll_ctl -1 zurück. Die Fehlerbehandlung meldet mir Fehler 11 (strerror liefert : Resource temporarily not available). Speicher ist jedoch durchaus genug frei, die Fehlermeldung scheint also nicht eindeutig...
Gibt es Erfahrungen, welche Fehler ein solches Verhalten auslösen würden bzw. wie diese zu lösen sind ?EDIT :
Die Fehlerquelle war lediglich die Handhabung der Parameter für epoll_wait in meinem entsprechenden Workerthread. Das benötigt nämlich in der Übergabe einen Zeiger auf ein Array aus epoll_events festgelegter Größe, nicht aber ein stumpf definiertes epoll_event, was man leider in einigen Tutorials/Dokus findet. Dann funzt zwar die Ausgabe einzelner Events, aber leider kann es durchaus vorkommen daß der zurückgegebene Inhalt eben ein paar mikrosekunden später für den anderen thread ins Nirvana zeigt, und bei der nächsten Verwendung gehts halt in die Hose