代码之家  ›  专栏  ›  技术社区  ›  Imran

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

  •  26
  • Imran  · 技术社区  · 17 年前

    您可以使用命令 最小二乘法 为所有正在运行的进程获取文件描述符,但我想做的是关闭其中一些描述符,而不在该进程中。这可以在Windows上完成,因此您可以轻松地取消阻止某些应用程序。

    有什么命令或功能吗?

    5 回复  |  直到 11 年前
        1
  •  2
  •   Windows programmer    17 年前

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

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

        2
  •  76
  •   crb    13 年前

    我不知道您为什么要这样做,但是您应该能够使用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
    
        3
  •  3
  •   Fernando Miguélez    17 年前

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

        4
  •  2
  •   CesarB    17 年前

    在Unix上比在Windows上更不需要这样做。

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

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

    在Unix中,只有在尝试卸载文件系统时才会出现这种情况(任何对已安装文件系统的引用都会阻止umount)。

        5
  •  1
  •   unwind    17 年前

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

    也许更多的细节会有用,关于你试图解决的阻塞问题。

    推荐文章