如何在setsid之后恢复控制tty

时间:2015-06-07 10:42:55

标签: c linux

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

如何恢复/ dev / tty上的控件?

1 个答案:

答案 0 :(得分:1)

使用ioctl( fd, TIOCSCTTY )

  

<强> TIOCSCTTY

     

int arg

     

使给定终端成为呼叫的控制终端   处理。调用进程必须是会话负责人而不是   控制终端已经。如果这个终端已经是   控制不同会话组的终端然后ioctl失败   使用EPERM,除非调用者是root用户(更确切地说:具有   CAP_SYS_ADMIN能力)和arg等于1,在这种情况下终端   被盗,所有将其作为控制终端的进程都会丢失   它。

     

<强>空隙

     

如果给定的终端是呼叫的控制终端   过程中,放弃这个控制终端。如果进程是会话   领导者,然后将SIGHUP和SIGCONT发送到前台进程组   并且当前会话中的所有进程都失去了控制权   终端

很多警告都适用。阅读这篇标题为"Reptyr: Changing a Process's Controlling Terminal"的博文,并查看引用的代码。该代码将一个进程从一个终端移植到另一个终端,并且可以完全满足您的需求。