コマンドlsofを使用して、実行中のすべてのプロセスのファイル記述子を取得できますが、私がやりたいのは、そのプロセス内にいなくても、これらの記述子の一部を閉じることです。これは Windows で実行できるため、一部のアプリケーションのブロックを簡単に解除できます。
そのためのコマンドまたは機能はありますか?
コマンドlsofを使用して、実行中のすべてのプロセスのファイル記述子を取得できますが、私がやりたいのは、そのプロセス内にいなくても、これらの記述子の一部を閉じることです。これは Windows で実行できるため、一部のアプリケーションのブロックを簡単に解除できます。
そのためのコマンドまたは機能はありますか?
なぜこれをやろうとしているのかわかりませんが、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
私はそうは思いませんが、 lsof ファイルを開いたプロセスのPIDを提供するので、できることはプロセスを完全に強制終了するか、少なくともシグナルを送信して終了させることです。
Windows よりも Unix でこれを行う必要はほとんどありません。
Windows では、ほとんどのプログラムは開いたファイルを「ロック」する (実際には共有を拒否する) 傾向があるため、別のプログラムがファイルを読み取り/書き込み/削除することはできません。
Unix では、ほとんどの場合、これは起こりません。Unix でのファイル ロックは主に推奨事項であり、通常の読み取り/書き込み/削除操作ではなく、他のロック試行のみをブロックします。プロセスの現在のディレクトリを削除することもできます。
Unix での通常の使用でこれが発生する唯一の状況は、ファイルシステムをアンマウントしようとするときです (マウントされたファイルシステムへの参照は、アンマウントをブロックする可能性があります)。
Windows では、実行中のカーネルにデバイス ドライバーを挿入するプログラムを誰かが作成したため、プログラムを使用してそれを行うことができます。ちなみに、これを行うのは危険な場合があります。壊れたアプリケーションが使用していたハンドルを閉じた後、アプリケーションはハンドルが閉じられたことを認識せず、アプリケーションが他の無関係なオブジェクトを開いたときに認識しないためです。同じハンドルが他の無関係なオブジェクトを参照する可能性があることを確認してください。壊れたアプリケーションをできるだけ早く強制終了したいのです。
Linux では、確かに同じ種類の手法を使用できます。実行中のカーネルにモジュールを挿入するプログラムを作成します。モジュールと通信し、どのハンドルを閉じるかを伝えます。そうするのも同様に危険です。
疑わしい。ファイル記述子はプロセスローカルでstdout
あり、すべてのプロセスに対して 1 ですが、もちろん一意のストリームを参照します。
おそらく、解決しようとしているブロッキングの問題について、より詳細な情報が役立つでしょう。