如何从UNIX系统中另一个进程关闭文件描述符
-
11-07-2019 - |
题
您可以用命令的 lsof的以获取文件描述符的所有正在运行的进程,但我想这样做是关闭其中的一些描述,而不在于过程中。这可以在Windows上进行的,因此您可以轻松地解除了一些应用程序。
是否有任何命令或功能?
解决方案
在Windows下你可以使用一个程序来做到这一点,因为有人写道,插入一个设备驱动程序到正在运行的内核做的程序。顺便说这可能是危险的做到这一点,因为你关闭一个手柄,一个破碎的应用程序是使用后,该应用程序不知道该把手被关闭,并在应用程序打开其他一些无关的对象,它不知道,同样的手柄现在可以参考一些其他不相关的对象。你真的想尽快杀破应用程序。
在Linux的肯定,你可以使用同一种技术。编写一个模组插入运行的内核的程序。与模块进行通信,并告诉它处理关闭。这将是同样危险这样做。
其他提示
我不知道为什么你想这样做,但你应该能够使用gdb进行附加到该进程,然后调用close()的FD。例如:
在一个壳:猫
在另一个壳:
$pidof cat
7213
$gdb -p 7213
...
lots of output
...
(gdb)
现在你告诉gdb来执行关闭(0):
(gdb) p close(0)
$1 = 0
(gdb) c
Continuing.
Program exited with code 01.
(gdb)
在所述第一壳体1得到这样的输出:
cat: -: Bad file descriptor
cat: closing standard input: Bad file descriptor
我不这么认为,但lsof的给你已打开该文件的过程,所以你可以做什么完全杀死进程,或至少发出一个信号,让它退出。
的PID我怀疑。文件描述符过程本地,stdout
为1的所有过程,但他们仍然参考当然独特流。
也许更详细的将是有益的,你正在试图解决的阻塞问题。
有需要是更要做到这一点在Unix上比在Windows。
在Windows中,大多数程序倾向于“锁定”(实际上是否认共享),他们打开的文件,所以他们不能被读取/写入/由另一程序中删除。
在Unix上,大部分的时间,这不会发生。在Unix文件锁定主要是咨询,只会阻止其他锁定的尝试,而不是正常的读/写/删除操作。甚至可以移除的过程的当前目录。
关于本出现在Unix的正常使用试图卸除文件系统(在所有的安装的文件系统的任何参考可阻断卸除)时,唯一的情况