Domanda

Puoi usare il comando lsof per ottenere descrittori di file per tutti i processi in esecuzione, ma quello che vorrei fare è chiudere alcuni di quei descrittori senza essere all'interno di quel processo. Questo può essere fatto su Windows, quindi puoi facilmente sbloccare alcune applicazioni.

C'è qualche comando o funzione per quello?

È stato utile?

Soluzione

In Windows puoi usare un programma per farlo perché qualcuno ha scritto un programma che inserisce un driver di dispositivo nel kernel in esecuzione per farlo. A proposito, può essere pericoloso farlo, perché dopo aver chiuso un handle utilizzato da un'applicazione non funzionante, l'applicazione non sa che l'handle è stato chiuso e quando l'applicazione apre qualche altro oggetto non correlato non lo sa che lo stesso handle potrebbe ora fare riferimento a qualche altro oggetto non correlato. Vuoi davvero uccidere l'applicazione danneggiata il più presto possibile.

In Linux sicuramente puoi usare lo stesso tipo di tecnica. Scrivi un programma che inserisce un modulo nel kernel in esecuzione. Comunicare con il modulo e dirgli quali handle chiudere. Sarà altrettanto pericoloso farlo.

Altri suggerimenti

Non so perché stai cercando di farlo, ma dovresti essere in grado di collegarti al processo usando gdb e quindi chiamare close () su fd. Esempio:

In una shell: cat

In un'altra shell:

$pidof cat
7213

$gdb -p 7213

...
lots of output
...

(gdb)

Ora dici a gdb di eseguire close (0):

(gdb) p close(0)

$1 = 0

(gdb) c

Continuing.

Program exited with code 01.
(gdb)

Nella prima shell ottengo questo output:

cat: -: Bad file descriptor

cat: closing standard input: Bad file descriptor

Non credo, ma lsof ti fornisce il PID del processo che ha aperto il file, quindi quello che puoi fare è uccidere del tutto il processo o almeno inviare un segnale per lasciarlo uscire.

Ne dubito. I descrittori di file sono process-local, stdout è 1 per tutti i processi, ma ovviamente fanno comunque riferimento a flussi unici.

Forse potrebbero essere utili maggiori dettagli sul problema del blocco che stai cercando di risolvere.

C'è molto meno bisogno di farlo su Unix che su Windows.

Su Windows, la maggior parte dei programmi tende a "bloccare" (nega effettivamente la condivisione) dei file che aprono, quindi non possono essere letti / scritti / eliminati da un altro programma.

Su Unix, il più delle volte ciò non accade. Il blocco dei file su Unix è principalmente consultivo e bloccherà solo altri tentativi di blocco, non le normali operazioni di lettura / scrittura / eliminazione. Puoi persino rimuovere la directory corrente di un processo.

L'unica situazione che si presenta durante il normale utilizzo in Unix è quando si tenta di smontare un filesystem (qualsiasi riferimento al filesystem montato può bloccare il umount).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top