Comment fermer un descripteur de fichier à partir d'un autre processus dans les systèmes Unix

StackOverflow https://stackoverflow.com/questions/323146

Question

Vous pouvez utiliser la commande lsof pour obtenir des descripteurs de fichier pour tous les processus en cours d'exécution, mais ce que je voudrais faire est de fermer certains de ces descripteurs sans être dans ce processus. Cela peut être fait sous Windows, vous pouvez donc facilement débloquer certaines applications.

Existe-t-il une commande ou une fonction pour cela?

Était-ce utile?

La solution

Sous Windows, vous pouvez utiliser un programme pour le faire, car quelqu'un a écrit un programme qui insère un pilote de périphérique dans le noyau en cours d'exécution. Soit dit en passant, cela peut être dangereux, car après la fermeture d'un descripteur utilisé par une application endommagée, l'application ne sait pas que le descripteur a été fermé et lorsque l'application ouvre un autre objet non lié qu'il ne connaît pas. que le même descripteur pourrait maintenant faire référence à un autre objet sans rapport. Vous voulez vraiment tuer l'application cassée dès que possible.

Sous Linux, vous pouvez sûrement utiliser le même type de technique. Ecrivez un programme qui insère un module dans le noyau en cours d’exécution. Communiquez avec le module et indiquez-lui les poignées à fermer. Ce sera tout aussi dangereux de le faire.

Autres conseils

Je ne sais pas pourquoi vous essayez de faire cela, mais vous devriez pouvoir vous connecter au processus en utilisant gdb, puis appeler close () sur le fd. Exemple:

Dans une coque: chat

Dans un autre shell:

$pidof cat
7213

$gdb -p 7213

...
lots of output
...

(gdb)

Maintenant, vous dites à gdb d'exécuter close (0):

(gdb) p close(0)

$1 = 0

(gdb) c

Continuing.

Program exited with code 01.
(gdb)

Dans le premier shell, j'obtiens cette sortie:

cat: -: Bad file descriptor

cat: closing standard input: Bad file descriptor

Je ne le pense pas, mais lsof vous donne le PID du processus qui a ouvert le fichier. Vous pouvez donc tuer complètement le processus ou au moins envoyer un signal pour le laisser sortir.

J'en doute. Les descripteurs de fichier sont des processus locaux, stdout vaut 1 pour tous les processus, mais ils font toujours référence à des flux uniques, bien sûr.

Peut-être davantage de détails seraient utiles sur le problème de blocage que vous essayez de résoudre.

Il est beaucoup moins nécessaire de le faire sous Unix que sous Windows.

Sous Windows, la plupart des programmes ont tendance à " verrouiller " (refusez en fait de partager) les fichiers qu’ils ouvrent afin qu’ils ne puissent pas être lus / écrits / supprimés par un autre programme.

Sous Unix, la plupart du temps, cela ne se produit pas. Le verrouillage de fichiers sous Unix est généralement consultatif et ne bloquera que les autres tentatives de verrouillage, mais pas les opérations normales de lecture / écriture / suppression. Vous pouvez même supprimer le répertoire en cours d'un processus.

La seule situation courante dans Unix est que vous essayez de démonter un système de fichiers (toute référence au système de fichiers monté peut bloquer le démontage).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top