如何从终端分离程序并将其附加回来?

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 之后,我在上面写了“它实际上并没有做这项工作”。我认为,我引用的链接(我不久前使用过)与您所建议的类似。但是您的输入肯定会进一步澄清它。谢谢

以上是关于如何从终端分离程序并将其附加回来?的主要内容,如果未能解决你的问题,请参考以下文章

如何分离从表行中获取的值并将其存储在雪花中的数组中

我们是不是应该在分叉进程终止之前分离共享内存

从 QDockWidget 附加和分离外部应用程序时的问题

如何分离数据并将其注册到数据库中

sqlserver 分离和附加

分离图像,然后将其附加到分离的位置