如何从终端分离程序并将其附加回来?
Posted
技术标签:
【中文标题】如何从终端分离程序并将其附加回来?【英文标题】:How to detach program from terminal and to attach it back? 【发布时间】:2012-10-19 17:27:42 【问题描述】:我正在开发一个嵌入式项目,我需要一个没有外部依赖项的程序,如 screen 或 tmux。这两个程序不好,因为它们需要其他库。
由于我只需要分离一个程序,在我再次登录时能够注销并恢复它,我想知道我是否可以为此编写一个小程序。
您知道我需要执行哪些调用(在 C 中)来分离程序并将其恢复吗?
【问题讨论】:
在终端中使用 nohup 运行你的程序 nohup 不像其他人那样让我有可能与用于程序的 shell 进行交互。顺便说一句,编译很痛苦。如果我用openembedded来做系统,会很容易,但是这次我可以编译简单的二进制文件,因为我没有完整的交叉编译环境。 你看过两者的源代码了吗? @WaleedKhan 是的,但它们很大,我不明白。 screen还需要哪些库?通常它使用的只是curses,但是一个最小的termcap库可以做(即使是一个不读取任何文件的库,只提供与您的特定终端或本质上通用的vt100匹配的硬编码字符串),或者您可以只是静态链接诅咒。也许您正在查看 Debian 打包版本,该版本链接到各种不需要的愚蠢东西.. :-) 【参考方案1】:如果我正确理解您的要求,理论上您可以使用 termios struct 和 ioctl 来实现这一点。
ioctl(0, TIOCNOTTY, NULL);
分离和
ioctl(0, TIOCSCTTY, 1);
附加到终端。但是,它实际上并没有执行这项工作。
以下解决方案描述了一个不太好的但实用的解决方法
tty demulsified
主要目的是将程序附加到另一个终端,但我相信这也是您实现目标的方式。
关于您提到的嵌入式平台,您也许可以从busybox获得一些帮助
它使用非常小的二进制文件为嵌入式 linux 编译,并包含大多数常用的 linux 实用程序,例如 getty、stty 等。
【讨论】:
实际上像这样分离和附加终端通常不会起作用,除非是非常专业的程序。您可能需要一种类似于 screen 的方法,其中程序的主要部分在伪 tty 上运行,并且单独的进程或线程负责打开和关闭真实 tty 并来回转发数据。 我想我的意思差不多。在描述了 api 之后,我在上面写了“它实际上并没有做这项工作”。我认为,我引用的链接(我不久前使用过)与您所建议的类似。但是您的输入肯定会进一步澄清它。谢谢以上是关于如何从终端分离程序并将其附加回来?的主要内容,如果未能解决你的问题,请参考以下文章