用于生成控制终端的 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 作为“解决方法”,所以这不是那么重要。
在 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 作为“解决方法”,所以这不是那么重要。