如何从unix系统中的另一个进程关闭文件描述符

Seb*_*Seb 27 unix bash file lsof file-descriptor

您可以使用命令lsof来获取所有正在运行的进程的文件描述符,但我想要做的是关闭其中一些描述符,而不是在该进程内部.这可以在Windows上完成,因此您可以轻松取消阻止某些应用程序.

那有什么命令或功能吗?

小智 77

我不知道你为什么要这样做,但你应该能够使用gdb附加到进程,然后在fd上调用close().例:

在一个壳:猫

在另一个shell中:

$pidof cat
7213

$gdb -p 7213

...
lots of output
...

(gdb)
Run Code Online (Sandbox Code Playgroud)

现在告诉gdb执行close(0):

(gdb) p close(0)

$1 = 0

(gdb) c

Continuing.

Program exited with code 01.
(gdb)
Run Code Online (Sandbox Code Playgroud)

在第一个shell中我得到了这个输出:

cat: -: Bad file descriptor

cat: closing standard input: Bad file descriptor
Run Code Online (Sandbox Code Playgroud)

  • 迟到总比没有好,但是当Eclipse决定在最糟糕的时刻耗尽fd时,这个技巧非常有效.干杯:) (2认同)

Win*_*mer 2

在 Windows 中,您可以使用程序来完成此操作,因为有人编写了一个程序,将设备驱动程序插入正在运行的内核中来完成此操作。顺便说一句,这样做可能很危险,因为在关闭损坏的应用程序正在使用的句柄后,应用程序不知道该句柄已关闭,并且当应用程序打开其他一些不相关的对象时,它也不知道同一个句柄现在可能引用一些其他不相关的对象。您确实想尽快杀死损坏的应用程序。

在 Linux 中你当然可以使用同样的技术。编写一个程序,将模块插入正在运行的内核中。与模块通信并告诉它关闭哪个句柄。这样做同样危险。