Empêcher le process en cours d'exécution d'écrire dans un file existant

J'ai un process P qui écrit le contenu dans un file F. Je dois pouvoir dynamicment activer / désactiver P pour écrire sur F. J'ai essayé de changer les permissions pour l'user / groupe mais cela nécessite le redémarrage du process (en fait l'set du système). À la fin, je devrais être en mesure d'exécuter un "script" qui fait ce qui suit:

EnablePWriteF sleep 10 DisablePWriteF 

et par conséquent P sera capable d'écrire pour les 10 premières secondes et pas après. J'utilise la dissortingbution Debian.

Est-ce possible?

Mise à jour: Le vrai cas d'utilisation est que j'essaie de filterr un process donné pour écrire dans un file de périphérique spécifique / dev / fb0 J'ai deux process qui écrivent dans ce file et je veux être capable de déterminer exactement l'un des deux qui est autorisé à écrire dans ce file à un moment donné sans avoir à tuer / arrêter les process.

Au less sur ma version de Linux, il semble que vous puissiez utiliser des verrous obligatoires. Je l'ai seulement testé avec /dev/null , mais je ne vois pas pourquoi il ne fonctionnerait pas avec d'autres périphériques comme vos tampons d'image:

En tant que 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 

Par exemple, en utilisant perl et le module File::FcntlLock (ou le faire directement en 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) 

Un process ouvre le périphérique fb0 via le fb0-for-process-A et l'autre via fb0-for-process-B et applique le locking aux deux files pour décider quel process peut écrire à un moment donné.

Non, pas vraiment (pour autant que je sache). Les permissions d'access au file ne sont vérifiées que lorsque le file est ouvert ( et il n'y a pas d'appel système pour les révoquer ). Par conséquent, si le process possède un descripteur de file avec permission d'écriture, il dispose d'une autorisation en écriture.

(Si vous faites un chmod simple sur le file, vous ne devriez pas avoir besoin d'un redémarrage. Si vous changez d'appartenance à un groupe, vous devez vous reconnecter pour que les changements prennent effet.)

En général, ce que vous pourriez faire, ce serait de diriger la sortie vers un tuyau et de faire en sorte que la fin de la lecture de la conduite soit de gérer (ou de transmettre) datatables ou de les éliminer. (La clarification ultérieure sur le cas d'utilisation étant donné que certains files de périphériques rendent cela un peu théorique, cependant.)