ファイル記述子からファイル名を取得

3719 ワード

プロジェクト内の小さな要件で、ファイル記述子が指すファイル名を1つのファイル記述子から取得する必要があるためです.
インタフェースでファイル記述子とファイル名を一緒にカプセル化して返すことができます.
しかし、他の場所でもこのようなアプリケーションがあるので、ファイル記述子から取得したファイル名を単独でインタフェースで使用できるようにしたいと思っています.
このインタフェースは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   
           
 
             ,