Select() mit normalen Dateien verwenden



  • Ich moechte mit select datei auf auf schreibzugriffe ueberwachen.
    Dazu habe ich mit FD_SET ein passendes set erstellt und dann select aufgerufen.
    Nun kommt select aber sofort zurueck und meldet mir die entsprechenden FD's im fdset.
    (geprueft mit FD_ISSET).

    wenn ich jedoch einen FD basierend auf einem netzwerksocket ueberwache und dann statt recv(..) ein select verwende, gehts perfekt.

    kann es sein, dass select immer zurueckkehrt, wenn ueber den filedescripter gelesen werden kann (und _nicht_ wenn sich etwas geaendert hat)?

    falls dem so ist, wie kann ich dann eine datei auf schreibzugriffe ueberpruefen und gleichzeitig auf eingehende netzwerkpaket lauschen?

    fnctl(...NOBLOCK...)und dann pollen in einer while schleife finde ich nicht so toll.



  • Belgarad schrieb:

    kann es sein, dass select immer zurueckkehrt, wenn ueber den filedescripter gelesen werden kann (und _nicht_ wenn sich etwas geaendert hat)?

    Exakt.



  • Na dann weiss ich zumindest erstmal wie es nicht geht 😉

    Hat den jemand eine idee wie ich eine datei auf schreibzugriffe ueberwachen kann, in einer art von benachrichtigung?

    beispiel: auf text.txt wird durch einen externen prozess schreibend zugegriffen. wie bekomme ich das in meinem prozess mit?



  • Vielleicht ein Strohhalm:

    fam - file alteration monitor

    fam is a server that tracks changes to the filesystem and
    relays these changes to interested applications. Applica�
    tions such as fm(1G) and mailbox(1) present an up-to-date
    view of the filesystem. In the absence of fam, these
    applications and others like them are forced to poll the
    filesystem to detect changes. fam is more efficient.



  • Belgarad schrieb:

    ...
    kann es sein, dass select immer zurueckkehrt, wenn ueber den filedescripter gelesen werden kann (und _nicht_ wenn sich etwas geaendert hat)?
    ...

    Das haettest du aber auch gewusst, wenn du dir die Manpages durchgelesen
    haettest 😉

    mfg
    v R



  • virtuell Realisticer schrieb:

    Das haettest du aber auch gewusst, wenn du dir die Manpages durchgelesen
    haettest 😉

    mfg
    v R

    hatte ich auch - war nur nicht sicher ob ich es richtig verstanden hatte 😉



  • du kannst unter linux auch dnotify verwenden. das ist ein feature des kernels, und du brauchst nur einen kernel, der das kann, und kein zusatzpaket wie fam. fam macht das auch nur über dnotify, soweit ich weiß.

    vielleicht schaust du dir aber methoden der interprocess communication an, da die dein problem besser lösen könnten.


Anmelden zum Antworten