用于生成控制终端的 ioctl 调用的文件描述符

File descriptor for ioctl call to make a controlling terminal

在 linux 上,为了能够控制从我的主进程派生出来的进程的生命周期,我通过调用 setsid() 使主进程成为会话和组长。然后看起来我需要让主进程为进程组创建一个控制终端,然后,一旦主进程终止,进程组中的所有其他进程都会收到一个 SIGHUP。我尝试为文件系统上的常规文件调用 open(),但 ioctl() 拒绝接受带有 'Inappropriate file descriptor' 的 fd。 posix_openpt() 我应该改用什么?手册页说它将创建一个伪终端和 return 文件描述符。我什至需要在 posix_openpt() 之后调用 ioctl(fd, TIOCSCTTY, 0),还是我真正需要的只是不使用 O_NOCTTY?谢谢!

Do I even need an ioctl(fd, TIOCSCTTY, 0) call after posix_openpt(), or not using O_NOCTTY is all I really need?

我刚试过 Ubuntu 18.04.5:

如果你不这样做并且控制进程关闭,systemd进程成为子进程的新控制进程并且子进程不接收SIGHUP

我不确定这种行为是否也适用于其他 Linux 发行版。

Is posix_openpt() what I should be using instead?

试试下面的代码:

int master, tty;

master = posix_openpty(O_RDWR);
grantpt(master);
unlockpt(master);
tty = open(ptsname(master), O_RDWR);
ioctl(tty, TIOCSCTTY, 0);

这必须在调用 setsid() 的同一进程中完成。

注意:一旦您完全关闭 master 文件,进程将收到 SIGHUP.

(“完全”是指:当您关闭由 dup() 创建的所有副本或通过创建继承句柄的子进程时。)

如果你真的想使用伪TTY,你不应该继承子进程的master句柄(或子进程中的close()句柄。但是,在你的情况下你只想使用伪 TTY 作为“解决方法”,所以这不是那么重要。