ファイル記述子からファイル名を取得
3719 ワード
プロジェクト内の小さな要件で、ファイル記述子が指すファイル名を1つのファイル記述子から取得する必要があるためです.
インタフェースでファイル記述子とファイル名を一緒にカプセル化して返すことができます.
しかし、他の場所でもこのようなアプリケーションがあるので、ファイル記述子から取得したファイル名を単独でインタフェースで使用できるようにしたいと思っています.
このインタフェースはlinuxシステムでしか使用できません.linuxシステムではすべてのものがファイルとして使用できるからです.
主にlsof命令を用いて実現した
lsof共通パラメータ
lsofの一般的な使い方は、アプリケーションが開いているファイルの名前と数を検索することです.特定のアプリケーションがログ・データをどこに記録しているか、または問題を追跡しているかを検索できます.たとえば、linuxはプロセスがファイルを開くことができる数を制限します.通常、この値は大きいので、問題は発生しません.必要に応じて、アプリケーションはより大きな値(上限まで)を要求することができます.アプリケーションがファイル記述子を消費したと疑う場合は、lsofを使用して開いているファイルの数を統計して検証できます.lsof構文フォーマットは次のとおりです.
一般的なパラメータのリスト:
インタフェースでファイル記述子とファイル名を一緒にカプセル化して返すことができます.
しかし、他の場所でもこのようなアプリケーションがあるので、ファイル記述子から取得したファイル名を単独でインタフェースで使用できるようにしたいと思っています.
このインタフェースはlinuxシステムでしか使用できません.linuxシステムではすべてのものがファイルとして使用できるからです.
主にlsof命令を用いて実現した
lsof共通パラメータ
lsofの一般的な使い方は、アプリケーションが開いているファイルの名前と数を検索することです.特定のアプリケーションがログ・データをどこに記録しているか、または問題を追跡しているかを検索できます.たとえば、linuxはプロセスがファイルを開くことができる数を制限します.通常、この値は大きいので、問題は発生しません.必要に応じて、アプリケーションはより大きな値(上限まで)を要求することができます.アプリケーションがファイル記述子を消費したと疑う場合は、lsofを使用して開いているファイルの数を統計して検証できます.lsof構文フォーマットは次のとおりです.
lsof [options] filename
一般的なパラメータのリスト:
lsof filename
lsof -a
lsof -c string COMMAND
lsof -u username user
lsof -g gid gid
lsof +d /DIR/
lsof +D /DIR/ , ,
lsof -d FD
lsof -n IP hostname, -n
lsof -i
lsof -i[46] [protocol][@hostname|hostaddr][:service|port]
46 --> IPv4 or IPv6
protocol --> TCP or UDP
hostname --> Internet host name
hostaddr --> IPv4
service --> /etc/service service name ( )
port --> ( )
lsof :
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
init 1 root cwd DIR 3,3 4096 2 /
init 1 root rtd DIR 3,3 4096 2 /
init 1 root txt REG 3,3 34352 13959233 /sbin/init
init 1 root mem REG 3,3 126648 9831535 /lib/ld-2.3.5.so
init 1 root mem REG 3,3 1489572 9831536 /lib/libc-2.3.5.so
init 1 root mem REG 3,3 81284 9830507 /lib/libsepol.so.1
init 1 root mem REG 3,3 68864 9831549 /lib/libselinux.so.1
init 1 root mem REG 0,0 0 [heap] (stat: No such file or directory)
init 1 root 10u FIFO 0,13 1887 /dev/initctl
syslogd 1584 root 2w REG 3,3 438824 1574198 /var/log/messages
syslogd 1584 root 3w REG 3,3 1581 1574338 /var/log/secure
syslogd 1584 root 4w REG 3,3 1678 1574346 /var/log/maillog
syslogd 1584 root 5w REG 3,3 10907 1574315 /var/log/cron
syslogd 1584 root 6w REG 3,3 0 1574365 /var/log/spooler
syslogd 1584 root 7w REG 3,3 0 1574363 /var/log/boot.log
syslogd 1584 root 8w REG 3,3 0 1606423 /var/log/news/news.crit
syslogd 1584 root 9w REG 3,3 0 1606424 /var/log/news/news.err
每行显示一个打开的文件,若不指定条件默认将显示所有进程打开的所有文件。lsof输出各列信息的意义如下:
COMMAND: PID: USER: FD: , 。 cwd、txt TYPE: , DIR、REG DEVICE: SIZE: NODE: ( ) NAME:
FD NAME
8 /var/log/news/news.crit
, popen FILE
, NAME
,