Frage

Sie können Befehl lsof , um Dateideskriptoren für alle laufenden Prozesse, aber was ich möchte, ist zu tun, einige dieser Deskriptoren zu schließen, ohne innerhalb dieses Prozesses zu sein. Dies kann unter Windows durchgeführt werden, so können Sie leicht eine Anwendung freizugeben.

Gibt es einen Befehl oder eine Funktion für das?

War es hilfreich?

Lösung

Unter Windows können Sie ein Programm verwenden, es zu tun, weil jemand ein Programm geschrieben, das einen Gerätetreiber in den laufenden Kernel fügt es zu tun. Durch die Art und Weise kann es gefährlich sein, dies zu tun, weil, nachdem Sie einen Griff schließen, dass eine gebrochene Anwendung wurde mit, wird die Anwendung nicht wissen, dass der Griff geschlossen wurde, und wenn die Anwendung eines anderes nicht verwandtes Objekt öffnet weiß es nicht könnte nun, dass der gleiche Griff zu einem anderen nicht verwandten Objekt bezieht. Sie wollen wirklich die defekte Anwendung so schnell wie möglich töten.

In Linux sicher können Sie die gleiche Art von Technik verwenden. Schreiben Sie ein Programm, das ein Modul in den laufenden Kernel einfügt. Kommunizieren Sie mit dem Modul und ihm sagen, was zu schließen Griffe. Es wird ebenso gefährlich sein, dies zu tun.

Andere Tipps

Ich weiß nicht, warum Sie dies tun versuchen, aber Sie sollten gdb anhängen der Lage sein, den Prozess mit und rufen Sie dann close () auf der fd. Beispiel:

In einer Schale: cat

In einer anderen Shell:

$pidof cat
7213

$gdb -p 7213

...
lots of output
...

(gdb)

Sie jetzt gdb sagen auszuführen schließen (0):

(gdb) p close(0)

$1 = 0

(gdb) c

Continuing.

Program exited with code 01.
(gdb)

In der ersten Schale erhalte ich folgende Ausgabe:

cat: -: Bad file descriptor

cat: closing standard input: Bad file descriptor

Ich glaube nicht, aber lsof gibt Ihnen die PID des Prozesses, der die Datei geöffnet hat, was so können Sie tun, um den Prozess vollständig zu töten oder zumindest ein Signal zu senden, lassen Sie es zu beenden.

Ich bezweifle es. Dateideskriptoren sind prozess lokal, stdout ist 1 für alle Prozesse, aber sie verweisen immer noch einzigartige Ströme natürlich.

Vielleicht genauer wäre nützlich, um die Blockierung Problem zu lösen Sie versuchen.

Es gibt viel weniger Notwendigkeit, dies auf Unix zu tun, als unter Windows.

Unter Windows sind in der Regel die meisten Programme zu „sperren“ (eigentlich deny Sharing) die Dateien, die sie öffnen, damit sie nicht von einem anderen Programm gelesen / geschrieben / gelöscht werden.

Auf Unix, die meiste Zeit dies nicht geschieht. Das Sperren von Dateien auf Unix ist vor allem beratende und wird nur andere Verriegelungs Versuche blockieren, nicht normal Lese- / Schreib- / Löschvorgänge. Sie können sogar das aktuelle Verzeichnis eines Prozesses entfernen.

über die einzige Situation, diese kommt in der normalen Gebrauch in Unix up wird bei dem Versuch, ein Dateisystem (jede Bezugnahme auf alle in das eingehängte Dateisystem kann die umount Block) unmounten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top