2010-11-23 9 views
3

Ich benutze libnetfilter_queue für mein Projekt. Von der C-App-Warteschlange kann über den "Warteschlangendatei-Deskriptor" zugegriffen werden. Ich habe 5 Warteschlangen und 5 Threads, um sie zu behandeln. Was ich erreichen möchte, ist Thread aufzuwachen, wenn genau zwei Pakete in der Warteschlange sind. Ich kam auf die Idee, eine Auswahlfunktion und ein Array von Ints zu verwenden, um anzuzeigen, wie viele Pakete in jeder Warteschlange eingereiht waren. Nach Auswahl von Exit mit> 0 Code überprüfe ich, welche Queue ein Paket erhalten hat und den Wert im Array inkrementiere, wenn es größer als 2 ist, wecke ich einen Thread auf. Alles wäre in Ordnung, aber Select gibt an, dass die Warteschlange Daten zu lesen hat, bis ich recv anrufe, und das kann ich nicht, weil ein separater Thread diese Pakete verarbeiten sollte. Hat jemand eine Idee, wie man dieses Problem lösen kann? Ich weiß, dass ich SO_RCVLOWAT einstellen kann, aber es löst mein Problem nicht, weil ich nicht weiß, welche Größe diese 2 Pakete sein werden.Wie wecken Sie einen Thread nach dem Empfang von 2 Paketen

+0

warum würden Sie so etwas brauchen? – jalf

Antwort

3

Wie von Tobu empfohlen, ist epoll eine bessere Wahl und es ist besser als Auswahl. Die meisten dieser Abruffunktionen geben jedoch an, dass ein Ereignis (Daten verfügbar) vorhanden ist, sofern nicht jemand liest. Verwenden Sie nach Möglichkeit das folgende Modell: Verwenden Sie epoll/select, um nach eingehenden Daten zu suchen und den Worker-Thread zu aktivieren. Lassen Sie den Arbeitsthread entscheiden, was mit den Daten zu tun ist (ein Paket, zwei oder mehr), bevor Sie die Arbeit tatsächlich erledigen.

ODER: Ein Reader-Thread-N Worker-Threads: Verwendet epoll, um alle eingehenden Daten zu warten und zu lesen und sie an die Warteschlange des entsprechenden Worker-Threads zu senden. Sobald die Paketanzahl den Schwellenwert erreicht, wecken Sie den Worker-Thread (mit einem Semaphor).

1

Sie suchen nach flankengesteuerten Ereignisbenachrichtigungen - Benachrichtigungen, die gesendet werden, wenn sich die Menge der verfügbaren Daten ändert. epoll funktioniert so, wenn Sie das EPOLLET-Flag verwenden, und standardmäßig wird die Benachrichtigung zurückgesetzt, damit Sie über neue Pakete benachrichtigt werden.

Bitte beachten Sie, dass Sie nur einmal benachrichtigt werden, wenn mehrere Pakete zwischen zwei epoll_wait-Anrufen ankommen.

+0

Ich sehe deinen Standpunkt. Wenn ich zu viel Zeit zwischen epoll_wait call verbracht habe und in dieser Zeit mehr als 1 Paket empfangen wurde, kann ich nicht feststellen, wie viele empfangen wurden. Danke für diese Information – pejotr

+0

Ist es wirklich _wenn die Menge der verfügbaren Daten sich ändert_ oder wenn es von leer zu nicht leer (für Empfangspuffer) geht? –

+0

Ich bin mir ziemlich sicher, dass es Ersteres ist: Immer wenn ein Paket ankommt. Der Kernel-Code justs setzt ein Flag, wenn ep_poll_callback aufgerufen wird und verfolgt nicht, ob der Puffer zu diesem Zeitpunkt voll war oder nicht. – Tobu

Verwandte Themen