ファイルを書き換えたプロセスを取得
Posted: 2018年1月23日(火) 23:30
特定のファイルを書き換えたプロセスの情報を取得するにはどうすればいいですか?調べる言葉が悪いのか調べても分かりません。
どのように調べたのでしょうか?ly さんが書きました:特定のファイルを書き換えたプロセスの情報を取得するにはどうすればいいですか?調べる言葉が悪いのか調べても分かりません。
それをC言語で実装する方法が分からないから質問しています。かずま さんが書きました:どのように調べたのでしょうか?ly さんが書きました:特定のファイルを書き換えたプロセスの情報を取得するにはどうすればいいですか?調べる言葉が悪いのか調べても分かりません。
「Linux ファイル アクセス 監視」や
「Windows ファイル アクセス 監視」で
検索するといろいろ出てきますが。
コマンドで取得する方法は分かっているということですか?ly さんが書きました: それを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);
}
#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;
}
プロセスID です。かずま さんが書きました: ・端末2で ./ino を実行し、/tmp/file1.txt が更新されるたびにプロセスD を表示