恢复对已关闭输入描述符进程的控制

Recovering control of a closed input descriptor process

在 scm(方案解释器)中做一些测试,我故意关闭了当前输入端口(相当于标准输入文件描述符)。一旦程序在 REPL 中运行,事情就变得疯狂了,系统地打印一条错误消息。我的问题是:我怎样才能恢复进程的控制,也就是说,我怎样才能重新建立这个进程的输入文件描述符?

搜索“更改 运行 进程的文件描述符”或类似内容,我找不到有用的文章。

提前致谢

系统信息:Debian 10.

你几乎可以肯定不能,尽管这在一定程度上取决于语言级端口如何映射到底层 OS 级 I/O 系统。

如果你所做的是关闭 OS 级别的标准输入,那么一切都会丢失:

  1. REPL 尝试从标准输入读取,在关闭时出现错误;
  2. 它试图引发一些错误,这将涉及提示用户输入...
  3. ...来自标准输入,已关闭,因此出现错误;
  4. 游戏结束。

生存的唯一方法是满足以下两个条件之一:

  • 您是否在已经准备好处理此问题的代码周围包装了一个错误处理程序;
  • 或者实现足够聪明,可以识别它在其关闭端口错误处理程序中遇到关闭端口错误,并以某种聪明的方式放弃。

基本上,一旦 OS 级标准输入消失,任何需要从中获取输入的东西都注定要失败:如果不对过程进行 OS 级手术,你就不能把它放回去。

然而,该实现有可能将单个 OS 级别的 I/O 流映射到多个语言级别的流,并且仅关闭这些流中的一个会使系统留下一些其他流- of-last-resort,它仍然可以与之交谈,并且仍然指的是 OS 级别的标准输入。 Common Lisp 是一个可以(取决于配置)执行此操作的系统示例。它有,例如,*standard-input* *error-output**query-io**terminal-io* 等流,并且很可能处于这样的情况,例如,*standard-input* 已关闭导致读取错误,但 *query-io* 仍指向某处有人在其末端。

我不知道 scm 是否这样做。