Pregunta

Puede usar el comando lsof para obtener descriptores de archivo para todos los procesos en ejecución, pero lo que me gustaría hacer es cerrar algunos de esos descriptores sin estar dentro de ese proceso. Esto se puede hacer en Windows, por lo que puede desbloquear fácilmente alguna aplicación.

¿Hay algún comando o función para eso?

¿Fue útil?

Solución

En Windows puede usar un programa para hacerlo porque alguien escribió un programa que inserta un controlador de dispositivo en el kernel en ejecución para hacerlo. Por cierto, puede ser peligroso hacer esto, porque después de cerrar un identificador que estaba usando una aplicación dañada, la aplicación no sabe que el identificador estaba cerrado, y cuando la aplicación abre algún otro objeto no relacionado, no lo sabe que el mismo identificador ahora podría referirse a algún otro objeto no relacionado. Realmente desea eliminar la aplicación rota tan pronto como sea posible.

En Linux seguramente puede usar el mismo tipo de técnica. Escriba un programa que inserte un módulo en el núcleo en ejecución. Comuníquese con el módulo y dígale qué manijas cerrar. Será igualmente peligroso hacerlo.

Otros consejos

No sé por qué está intentando hacer esto, pero debería poder adjuntarlo al proceso usando gdb y luego llamar a close () en el fd. Ejemplo:

En una concha: gato

En otro shell:

$pidof cat
7213

$gdb -p 7213

...
lots of output
...

(gdb)

Ahora le dice a gdb que ejecute close (0):

(gdb) p close(0)

$1 = 0

(gdb) c

Continuing.

Program exited with code 01.
(gdb)

En el primer shell obtengo esta salida:

cat: -: Bad file descriptor

cat: closing standard input: Bad file descriptor

No lo creo, pero lsof te da el PID del proceso que ha abierto el archivo, así que lo que puedes hacer es eliminar completamente el proceso o al menos enviar una señal para que salga.

Lo dudo. Los descriptores de archivo son locales de proceso, stdout es 1 para todos los procesos, sin embargo, todavía hacen referencia a secuencias únicas, por supuesto.

Quizás sería útil tener más detalles sobre el problema de bloqueo que está tratando de resolver.

Hay mucho menos necesidad de hacer esto en Unix que en Windows.

En Windows, la mayoría de los programas tienden a "bloquearse" (en realidad niega compartir) los archivos que abren, por lo que otro programa no puede leerlos / escribirlos / eliminarlos.

En Unix, la mayoría de las veces esto no sucede. El bloqueo de archivos en Unix es principalmente asesor, y solo bloqueará otros intentos de bloqueo, no las operaciones normales de lectura / escritura / eliminación. Incluso puede eliminar el directorio actual de un proceso.

La única situación que se presenta en el uso normal en Unix es cuando se intenta desmontar un sistema de archivos (cualquier referencia al sistema de archivos montado puede bloquear el montaje).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top