2012-03-13 15 views
3

python(posix/linux)を使ってファイルをロックした人を見つける必要があります。現在、この方法を使用しています。ファイルをロックしたプロセスのPIDを見つける

flk = struct.pack('hhqql', fcntl.F_WRLCK, 0, 0, 0, 0) 
flk = struct.unpack('hhqql', fcntl.fcntl(self.__file, fcntl.F_GETLK , flk)) 

if flk[0] == fcntl.F_UNLCK: 
    # file is unlocked ... 
else: 
    pid = flk[4] 

このソリューションはアーキテクチャに依存しません。 fcntlに渡される構造体には、off_tやpid_tなどのフィールドが含まれます。私はこれらのタイプのサイズについて仮定することはできません。

struct flock { 
    ... 
    short l_type; /* Type of lock: F_RDLCK, 
        F_WRLCK, F_UNLCK */ 
    short l_whence; /* How to interpret l_start: 
        SEEK_SET, SEEK_CUR, SEEK_END */ 
    off_t l_start; /* Starting offset for lock */ 
    off_t l_len;  /* Number of bytes to lock */ 
    pid_t l_pid;  /* PID of process blocking our lock 
        (F_GETLK only) */ 
    ... 
}; 

PIDを見つける他の方法はありますか?あるいは、off_tとpid_tのサイズですか?ソリューションは、異なるアーキテクチャ間で完全にポータブルでなければなりません。

編集 私は以下の提案としてのlsofプログラムを使用することにしました。別のオプションは、/ proc/filesを解析することです。

答えて

4

これを行うには、外部プログラムlsofを使用してみてください。

Lsof revision 4.85 lists on its standard output file information 
    about files opened by processes for the following UNIX dialects: 

     AIX 5.3 
     Apple Darwin 9 and Mac OS X 10.[56] 
     FreeBSD 4.9 and 6.4 for x86-based systems 
     FreeBSD 8.[02] and 9.0 for AMD64-based systems 
     Linux 2.1.72 and above for x86-based systems 
     Solaris 9, 10 and 11 
+0

pbsモジュールは外部ユーティリティを呼び出すのに便利です:pbs.lsof( '/ path/to/some/file') –

+0

ありがとうございました!完璧に動作します。 – user1267671

0

私はそれが最も密接にプラットフォーム間off_tにマップするだろうと思ったので、私は以前に'hhllh'を使用していました。しかし最終的に私は'hhqqh'に着いた。これは32bitと64bitシステムで私にとってはうまくいく。システムがすでに__USE_FILE_OFFSET64定義しない限り、

私は、このソリューションに驚くが、何が、私はあるbits/fcntl.hを見ていた32ビットの箱のために起こっているように思われたが、off64_tflock構造体を作成します(その場合、それは通常のを使用しています'ol off_t)ですので、l_startl_lenのサイズは常に8です(pythonのstruct format char 'q'long longです)。

これはおそらく完全なポータブルではないですが、現代の32ビットシステムでこれを行うつもりはないとは言えませんが、今のところ私にとっては十分でした。だから、自分のような)は、別のプロセスをexecしなくても、文字列解析YMMVを実行する必要はありません。また、なぜ私はこのフォーマット文字列が両方のプラットフォームで動作するように思われるのか誤解している(またはあまり説明していない)場合、誰かが私を修正する可能性がありますか?

関連する問題