すでに実行中のプロセスが既存のファイルに書き込むのを防ぐ

すでに実行中のプロセスが既存のファイルに書き込むのを防ぐ

ファイルFにコンテンツを書き込むプロセスPがある。 Fに書き込むには、Pを動的に有効/無効にできる必要があります。ユーザー/グループの権限を変更しようとしましたが、これによりプロセス(実際にはシステム全体)を再起動する必要がありました。最後に、以下を実行する「スクリプト」を実行できる必要があります。

EnablePWriteF  
sleep 10  
DisablePWriteF  

したがって、最初の10秒間Pに書き込むことができますが、それ以降は書き込めません。私はDebianディストリビューションを使用しています。

可能ですか?

アップデート:実際のユースケースは、特定のデバイスファイル/ dev / fb0に書き込むために特定のプロセスをフィルタリングしようとしていることです。そのファイルに書き込む2つのプロセスがあり、そのうちのどのプロセスを正確に決定できるようにしたいと思います。与えられた瞬間に2つのプロセスが許可されます。プロセスを終了/停止せずにファイルに書き込みます。

答え1

少なくとも私のバージョンのLinuxでは、強制ロックを使用できるようです。私はそれを次の/dev/nullようにテストしました。

rootユーザーとして:

mount -t tmpfs -o mand locked-fb some-dir
cp -a /dev/fb0 some-dir/fb0-for-process-A
cp -a /dev/fb0 some-dir/fb0-for-process-B
chmod g+s some-dir/fb0-for-process-[AB] # enable mand-lock

たとえば、perlandFile::FcntlLockモジュールを使用する場合、またはCで直接実行する場合:

#! /usr/bin/perl
use File::FcntlLock;

$l = new File::FcntlLock;
$l->l_type(F_RDLCK);

open my $fba, '<', 'some-dir/fb0-for-process-A' or die$!;

sleep 10; # writing OK
$l->lock($fba, F_SETLK); # writing blocked on fb0-for-process-A

sleep 10;
exit; # lock now released (or do an explicit unlock)

あるプロセスがそのファイルを介してfb0デバイスを開き、fb0-for-process-A別のプロセスfb0-for-process-Bを介して両方のファイルにロックを適用して、特定の時間にどのプロセスが書き込むことができるかを決定します。

答え2

いいえ、そうではありません(私の知る限り)。ファイルアクセス権は、ファイルが開いているときにのみ確認されます(そしてそれを元に戻すためのシステムコールはありません。)、したがって、プロセスに書き込み権限を持つファイルハンドルがある場合は、書き込み権限があります。

(ファイルに対して簡単な操作を行う場合は、再起動はchmod必要ありません。グループメンバーなどを変更する場合は、変更を適用するには再度ログインする必要があります。)

一般的に言えば、出力をパイプに送信し、パイプの読み取り側でデータが処理(または転送)されるか削除されるかを制御することができます。 (しかし、いくつかのデバイスファイルのユースケースの後で明確な説明は、この点についていくつかの議論を引き起こします。)

関連情報