linux - session 负责人如何在 Linux 中控制 tty?

标签 linux

我试图守护进程,发现我们应该 fork() 两次。原因是,如果进程是 session 领导者,那么它可以控制 tty。我想知道,这个理论背后的基本原理是什么。

最佳答案

第一个分支是在单独的 session 中运行守护进程。您应该为守护进程做的是(伪代码):

fork()
if (parent) {
    return
else if (child) {
    setsid();
    closefds();
    fork();
    if (child) {
        childwork();
    } else {
        exit(0);
    }
}

setsid call 将守护进程置于它自己的 session 中,并将它与父进程的 tty 解除关联。如果您不执行 setsid 调用,那么您不会获得新 session ,并且守护进程可能会受到它仍然属于的进程组的干扰 - 即它可能会受到干扰HUP 发送给整个进程组。

第二次 fork() 调用导致进程不再是 session 领导者。这意味着如果进程打开未使用的终端设备(无意或有意),则进程将无法获得控制终端,因为它不是 session 领导者。如果它仍然是 session 领导者,那么为了安全起见,您必须确保必须使用 O_NOCTTY 调用所有打开终端设备的打开调用。

关于linux - session 负责人如何在 Linux 中控制 tty?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20785486/

相关文章:

linux - 如何使用 bash 脚本从多个服务器获取 java 版本/spark 版本/pip 列表和 anaconda 列表

linux - 在 linux ec2 上安装 monit 失败

linux - 在linux中回显路径有什么作用?

linux - 使用 Rtlinux 命令运行可执行文件与使用 FIFO 策略调度进程/线程之间的区别

linux - Ctrl-p 和 Ctrl-n 在 Docker 下的行为异常

linux - 如何安装 enthoughts python virtualenv (linux mint)

java - arch linux 中的 mvn clean install 产生许多错误

linux - 对于任何 Linux Distro 的打包系统,找到可同时安装的包的最大数量

linux - 使用单个命令刷新特定的 Redis 数据库

c - Linux Port 总是写什么