ファイルを書き換えたプロセスを取得

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ly

ファイルを書き換えたプロセスを取得

#1

投稿記事 by ly » 7年前

特定のファイルを書き換えたプロセスの情報を取得するにはどうすればいいですか?調べる言葉が悪いのか調べても分かりません。

かずま

Re: ファイルを書き換えたプロセスを取得

#2

投稿記事 by かずま » 7年前

ly さんが書きました:特定のファイルを書き換えたプロセスの情報を取得するにはどうすればいいですか?調べる言葉が悪いのか調べても分かりません。
どのように調べたのでしょうか?

「Linux ファイル アクセス 監視」や
「Windows ファイル アクセス 監視」で
検索するといろいろ出てきますが。

ly

Re: ファイルを書き換えたプロセスを取得

#3

投稿記事 by ly » 7年前

かずま さんが書きました:
ly さんが書きました:特定のファイルを書き換えたプロセスの情報を取得するにはどうすればいいですか?調べる言葉が悪いのか調べても分かりません。
どのように調べたのでしょうか?

「Linux ファイル アクセス 監視」や
「Windows ファイル アクセス 監視」で
検索するといろいろ出てきますが。
それをC言語で実装する方法が分からないから質問しています。

かずま

Re: ファイルを書き換えたプロセスを取得

#4

投稿記事 by かずま » 7年前

ly さんが書きました: それをC言語で実装する方法が分からないから質問しています。
コマンドで取得する方法は分かっているということですか?

OS が何かすら指定していませんね。

多くの人から、適切な回答がなるべく早く得られるように
フォーラムルールをよく読んで、質問は具体的に行ってください。

かずま

Re: ファイルを書き換えたプロセスを取得

#5

投稿記事 by かずま » 7年前

Linux の場合です。

proc.c

コード:

#include <stdio.h>   // fopen, fclose, fprintf, puts
#include <unistd.h>  // getpid, sleep

int main(void)
{
    pid_t pid = getpid();
    char *name = "/tmp/file1.txt";
    FILE *fp = fopen(name, "w");
    if (!fp) { puts("fopen failed"); return 1; }

    for (int i = 0; i < 10; i++) {
        fprintf(fp, "%d\n", i);
        fflush(fp);
        printf("%d: %d %s\n", i, pid, name);
        sleep(1);
    }
    fclose(fp);
}
ino.c

コード:

#include <stdio.h>        // popen, pclose
#include <sys/inotify.h>  // inotify_init, inotify_add_watch
#include <unistd.h>       // read

int main(void)
{
    struct inotify_event *ie;
    char buf[4096], *p;
    int fd, wd, len;
    const char *name = "/tmp/file1.txt";

    fd = inotify_init();
    if (fd < 0) { puts("inotify_init failed"); return 1; }

    wd = inotify_add_watch(fd, name, IN_OPEN | IN_CLOSE | IN_MODIFY);
    if (wd < 0) { puts("inotifye_add_watch failed"); return 2; }

    while ((len = read(fd, buf, sizeof buf)) > 0) {
        for (p = buf; p < buf + len; p += sizeof(*ie) + ie->len) {
            ie = (struct inotify_event *) p;
            if (ie->mask & IN_MODIFY) {
                int pid;
                FILE *fp;
                char cmd[1024];
                sprintf(cmd, "lsof -Fp %s", name);
                fp = popen(cmd, "r");
                if (fp) {
                    if (fscanf(fp, "p%d", &pid) == 1)
                        printf("[%s] pid = %d\n", name, pid);
                    pclose(fp);
                }
            }
        }
    }
    close(fd);
    puts("done");
    return 0;
}
端末を 2つ開き、
・端末1で ./proc を実行し、1秒ごとに /tmp/file1.txt を更新
・端末2で ./ino を実行し、/tmp/file1.txt が更新されるたびにプロセスD を表示
・端末1で ./proc を実行し、1秒ごとに /tmp/file1.txt を更新
・端末2で Ctrl-C を入力し、ino を終了

かずま

Re: ファイルを書き換えたプロセスを取得

#6

投稿記事 by かずま » 7年前

かずま さんが書きました: ・端末2で ./ino を実行し、/tmp/file1.txt が更新されるたびにプロセスD を表示
プロセスID です。

監視したいファイルが複数ある場合は、
inotify_add_watch をそのファイルの個数回実行して
watch descriptor を配列 wd[] に憶えておき、
inotify_event 取得時に ie->wd を見ると、
どのファイルかが分かります。

ファイルの代わりにディレクトリを指定すると
ie->len がゼロではなくなり、そのディレクトリ内で
更新されたファイル名が ie->name に入っています。

返信

“C言語何でも質問掲示板” へ戻る