我怎样才能恢复setsid后控制tty

fork()我做一个setsid来创build一个新的会话。 但是当我这样做时,我不能使用像emacs这样的termcaps程序。 它执行错误"emacs: Could not open file: /dev/tty".

我怎样才能恢复/ dev / tty的控制?

使用ioctl( fd, TIOCSCTTY )

TIOCSCTTY

int arg

使给定终端成为呼叫过程的控制终端。 呼叫过程必须是会话领导者,并且不具有控制终端。 如果这个终端已经是一个不同的会话组的控制终端,那么ioctl会以EPERM的方式失败,除非主叫方是root(更精确地说:具有CAP_SYS_ADMIN能力)并且arg等于1,在这种情况下,终端被盗,所有进程那控制终端就失去了它。

空虚

如果给定终端是呼叫过程的控制终端,则放弃该控制终端。 如果进程是会话负责人,则将SIGHUP和SIGCONT发送到前台进程组,并且当前会话中的所有进程都将丢失其控制终端。

许多警告适用。 阅读此标题为“Reptyr:更改进程的控制终端”的博客文章,并查看所引用的代码。 该代码将一个流程从一个终端移植到另一个终端,可能正是您所需要的。