0

私の問題は、inotifyを使用して複数のディレクトリを監視し、read()関数を使用して変更を読み取ることです。私のポイントは、read()関数が現在監視されているディレクトリに何かが起こるまでプログラムを停止するため、このすべてのディレクトリを「同時に」(「for」ループ)監視できないということです。

簡略化された「メイン」コードがあります。

while (1){

    for(int i = 0; i < numberOfDirectories; i++){

        string fileEnd = get_event(fd[i], catalogs[i]).c_str());
        if(string != "") do some code;

    }
sleep(1);
}

get_eventが変更されたファイルへのパスを返す場合、fd [i]はinotifyのインスタンスであり、catalogs[i]には監視対象ディレクトリの名前が含まれます。

そして、get_evenfuncのコードがいくつかあります。

#define BUFF_SIZE ((sizeof(struct inotify_event)+FILENAME_MAX)*1024)
string get_event(int fd, string target)
{
    ssize_t len;    
    char buff[BUFF_SIZE] = {0};       

    len = read (fd, buff, BUFF_SIZE); 

この時点で、メインの「for」ループは動作を停止し、最初のディレクトリで何かが発生するまで待ちます。変更を待つのではなく、監視対象ディレクトリに変更があるかどうかを確認したいだけです。

ヘルプ:<

4

2 に答える 2

1

LINUX / UNIXを使用している場合は、SELECTを使用して、新しい変更がないか複数のファイル記述子を監視できます。どちらの変更を最初に行っても、ブロッキング待機が中断され、変更された記述子の番号が表示され、処理できるようになります。その後、もう一度監視します。

呼び出しの記述子セット内で関心のある場所のすべての記述子を提供する限り、どの記述子が使用されているかに関係なく、変更をキャッチできます。

于 2012-05-23T14:36:02.390 に答える
0

電話

fcntl(fd, F_SETFL, O_NONBLOCK);

read(...)関数の直前で、ファイル記述子を強制的に非ブロッキングモードにします。

于 2012-05-23T14:48:21.917 に答える