32

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

有什么命令或功能吗?

4

5 回答 5

85

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

在一个外壳中:猫

在另一个外壳中:

$pidof cat
7213

$gdb -p 7213

...
lots of output
...

(gdb)

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

(gdb) p close(0)

$1 = 0

(gdb) c

Continuing.

Program exited with code 01.
(gdb)

在第一个 shell 中,我得到以下输出:

cat: -: Bad file descriptor

cat: closing standard input: Bad file descriptor
于 2008-11-27T08:03:39.840 回答
3

我不这么认为,但是 lsof 会为您提供打开文件的进程的 PID,因此您可以做的是完全终止该进程或至少发送一个信号让它退出。

于 2008-11-27T07:51:15.793 回答
2

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

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

于 2008-11-27T07:48:07.003 回答
2

我对此表示怀疑。文件描述符是进程本地的,stdout对所有进程都是 1,但它们当然仍然引用唯一的流。

关于您要解决的阻塞问题,也许更多细节会很有用。

于 2008-11-27T07:50:27.683 回答
2

在 Unix 上比在 Windows 上做这件事的需要少得多。

在 Windows 上,大多数程序倾向于“锁定”(实际上是拒绝共享)它们打开的文件,因此它们不能被其他程序读取/写入/删除。

在 Unix 上,大多数情况下不会发生这种情况。Unix 上的文件锁定主要是建议性的,只会阻止其他锁定尝试,而不是正常的读/写/删除操作。您甚至可以删除进程的当前目录。

关于在 Unix 中正常使用中出现的唯一情况是尝试卸载文件系统时(对已安装文件系统的任何引用都可能阻止卸载)。

于 2008-11-29T18:09:21.900 回答