2

次のコードがあります。

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <time.h>
#include <event.h>

void fd_cb(int fd,short event,void *arg){
        printf("changed\n");
}

int main(int argc, const char* argv[]){
        struct event eoh_ev;
        FILE *fp;
        int fd;
        fp=fopen("/var/log/syslog","rw");
        fd=fileno(fp);

        event_init();
        event_set(&eoh_ev,fd,EV_READ|EV_WRITE,fd_cb,NULL);
        event_add(&eoh_ev,NULL);
        event_dispatch();


        return 0;
}

ご覧のとおり、/var/log/syslog に何かが書き込まれたときに fd_cb(...) を呼び出そうとしています。

問題は、「changed」が印刷されないことです。

コードをルートとして実行しています。

よろしくお願いします。

4

1 に答える 1

3

Libeventは、pollまたはselectサポートするのと同じファイル記述子で動作するように設計されています。これらのシステムコールは、ファイル変更イベントをチェックするようには設計されていません。これらは、ファイル記述子がブロックせずに読み取りまたは書き込みできる場合に戻るように設計されています。これは、通常のファイルにはあま​​り意味がありません(通常のファイルの読み取りと書き込みは、見方によって、ブロックされないか、常にブロックされる可能性があります)。 。言い換えると、ソケット、パイプ、fifo:s以外のファイル記述子のlibeventは機能しません。

ファイルが変更されたかどうかをチェックするための他のメカニズムがありますが、それらは移植性がありません。

于 2012-11-27T15:04:47.933 に答える