ファイルを使用しているのは誰だ(fuser)


アニメ『Free!』(2013)
今年3期も放送予定されてる水泳アニメの1期です。

スポーツアニメはたくさんありますが、水泳は初めて見ました。
私が水泳が苦手なので、水泳でどこまで面白くできるのか不思議な感じです。

今回はファイルがロックされているかフリーなのか調べるコマンド、fuser(使用しているプロセスを特定するコマンド)を使います。

まず適当にプログラムを作ります。

takk@deb9:~/tmp$ echo 'int main(){while(1);}' >t.c
takk@deb9:~/tmp$ cat t.c
int main(){while(1);}
takk@deb9:~/tmp$ gcc t.c
takk@deb9:~/tmp$ 

無限ループするだけのプログラムです。

このプログラムをバックグラウンドで実行します。

takk@deb9:~/tmp$ ./a.out &
[1] 4389
takk@deb9:~/tmp$ ps
  PID TTY          TIME CMD
 4202 pts/1    00:00:00 bash
 4389 pts/1    00:00:01 a.out
 4390 pts/1    00:00:00 ps
takk@deb9:~/tmp$ 

プロセスID 4389が先ほど実行したプログラムです。

fuserでa.outを指定してプロセスIDを確認します。

takk@deb9:~/tmp$ fuser -v a.out
                     USER        PID ACCESS COMMAND
/home/takk/tmp/a.out:
                     takk       4389 ...e. a.out
takk@deb9:~/tmp$ 

ACCESSを見るとeのフラグが表示されています。a.outが、実行中のファイルであることを表しています。

次は、ファイルをオープンしたままにするプログラムを作ります。

takk@deb9:~/tmp$ cat t.c
#include <stdio.h>
int main(){
	FILE *fp;
	fp = fopen("b.txt","w");
	while(1);
}
takk@deb9:~/tmp$ 
takk@deb9:~/tmp$ gcc -o b.out t.c

ビルドしてb.outを作成しました。実行するとb.txtという名前でファイルをオープンします。

実行します。

takk@deb9:~/tmp$ ./b.out &
[2] 4448
takk@deb9:~/tmp$ ps
  PID TTY          TIME CMD
 4202 pts/1    00:00:00 bash
 4389 pts/1    00:04:50 a.out
 4448 pts/1    00:00:00 b.out
 4449 pts/1    00:00:00 ps
takk@deb9:~/tmp$ 

b.outはプロセスIDが4448です。

fuserでb.outが開いているb.txtを指定してみます。

takk@deb9:~/tmp$ fuser -v b.txt
                     USER        PID ACCESS COMMAND
/home/takk/tmp/b.txt:
                     takk       4448 F.... b.out
takk@deb9:~/tmp$ 

ACCESSに、Fが表示されました。b.txtは、b.outによってアクセスされているファイルであることを表しています。

誰からも使われていないt.cも確認してみます。

takk@deb9:~/tmp$ fuser -v t.c
takk@deb9:~/tmp$ 

何も表示されません。ということで、このファイルはフリーです。

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA