【问题标题】:Recovering control of a closed input descriptor process恢复对关闭的输入描述符进程的控制
【发布时间】:2021-04-27 11:42:38
【问题描述】:

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

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

提前致谢

系统信息:Debian 10。

【问题讨论】:

  • 为什么关闭current-input-port?这不是你通常会做的事情。
  • 如果我明白你的意思,解决这个问题的最佳方法是避免这种显然毫无意义的情况,对吧?我同意这不是通常的事情。但这不是重点。关键是如何恢复对进程的控制(即不杀死它并再次打开它)。
  • 你通常不能重新打开一个进程的标准输入——当然没有跨平台的解决方案。 (重点,您关闭的current-input-port 是一个需要删除而不是解决的错误。)
  • 我不相信关闭当前输入端口是独立于情况的错误。无论如何,你的答案是相关的。谢谢。

标签: scheme file-descriptor io-redirection


【解决方案1】:

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

如果您所做的是关闭操作系统级别的标准输入,那么一切都会丢失:

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

唯一的办法就是让两件事中的一件成为现实:

  • 要么你已经为已经准备好处理这个问题的代码包装了一个错误处理程序;
  • 或者实现足够智能,可以识别出它在其封闭端口错误处理程序中遇到封闭端口错误,并以某种智能方式放弃。

基本上,一旦操作系统级别的标准输入消失,任何需要从中获取输入的东西都注定要失败:如果不对进程进行操作系统级别的手术,您就无法将其放回原处。

但是,实现可能会将单个操作系统级别的 I/O 流映射到多个语言级别的流,并且仅关闭这些流中的一个会使系统留下一些其他的最后手段流仍然可以说话,这仍然是指操作系统级别的标准输入。 Common Lisp 是可以(取决于配置)执行此操作的系统示例。例如,它有*standard-input**error-output**query-io**terminal-io* 和其他流,并且很可能处于*standard-input* 已关闭导致读取错误,但@ 987654326@ 仍然指向一个人在它末端的地方。

我不知道 scm 是否这样做。

【讨论】:

  • 终于有一些值得思考的东西了。非常感谢!
猜你喜欢
  • 2011-06-24
  • 2018-05-29
  • 1970-01-01
  • 2012-04-29
  • 2013-02-22
  • 1970-01-01
  • 2017-09-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多