32

コマンドlsofを使用して、実行中のすべてのプロセスのファイル記述子を取得できますが、私がやりたいのは、そのプロセス内にいなくても、これらの記述子の一部を閉じることです。これは Windows で実行できるため、一部のアプリケーションのブロックを簡単に解除できます。

そのためのコマンドまたは機能はありますか?

4

5 に答える 5

85

なぜこれをやろうとしているのかわかりませんが、gdb を使用してプロセスにアタッチし、fd で close() を呼び出すことができるはずです。例:

1 つのシェルで: 猫

別のシェルで:

$pidof cat
7213

$gdb -p 7213

...
lots of output
...

(gdb)

ここで、gdb に close(0) を実行するように指示します。

(gdb) p close(0)

$1 = 0

(gdb) c

Continuing.

Program exited with code 01.
(gdb)

最初のシェルでは、次の出力が得られます。

cat: -: Bad file descriptor

cat: closing standard input: Bad file descriptor
于 2008-11-27T08:03:39.840 に答える
3

私はそうは思いませんが、 lsof ファイルを開いたプロセスのPIDを提供するので、できることはプロセスを完全に強制終了するか、少なくともシグナルを送信して終了させることです。

于 2008-11-27T07:51:15.793 に答える
2

Windows よりも Unix でこれを行う必要はほとんどありません。

Windows では、ほとんどのプログラムは開いたファイルを「ロック」する (実際には共有を拒否する) 傾向があるため、別のプログラムがファイルを読み取り/書き込み/削除することはできません。

Unix では、ほとんどの場合、これは起こりません。Unix でのファイル ロックは主に推奨事項であり、通常の読み取り/書き込み/削除操作ではなく、他のロック試行のみをブロックします。プロセスの現在のディレクトリを削除することもできます。

Unix での通常の使用でこれが発生する唯一の状況は、ファイルシステムをアンマウントしようとするときです (マウントされたファイルシステムへの参照は、アンマウントをブロックする可能性があります)。

于 2008-11-29T18:09:21.900 に答える
2

Windows では、実行中のカーネルにデバイス ドライバーを挿入するプログラムを誰かが作成したため、プログラムを使用してそれを行うことができます。ちなみに、これを行うのは危険な場合があります。壊れたアプリケーションが使用していたハンドルを閉じた後、アプリケーションはハンドルが閉じられたことを認識せず、アプリケーションが他の無関係なオブジェクトを開いたときに認識しないためです。同じハンドルが他の無関係なオブジェクトを参照する可能性があることを確認してください。壊れたアプリケーションをできるだけ早く強制終了したいのです。

Linux では、確かに同じ種類の手法を使用できます。実行中のカーネルにモジュールを挿入するプログラムを作成します。モジュールと通信し、どのハンドルを閉じるかを伝えます。そうするのも同様に危険です。

于 2008-11-27T07:48:07.003 に答える
2

疑わしい。ファイル記述子はプロセスローカルでstdoutあり、すべてのプロセスに対して 1 ですが、もちろん一意のストリームを参照します。

おそらく、解決しようとしているブロッキングの問題について、より詳細な情報が役立つでしょう。

于 2008-11-27T07:50:27.683 に答える