📅  最后修改于: 2023-12-03 15:02:43.645000             🧑  作者: Mango
在 Linux 系统中,setsid 命令被用来启动一个子进程,并将其从父进程中分离出来,使之成为一个新的会话组和进程组的领导者,从而将其脱离控制终端的影响。
当一个普通命令被执行时,它所属的进程组和会话组的领导者都是当前 shell 进程。如果该进程组使用了终端设备,那么该命令就会接收来自该终端设备的信号(如中断信号)。但是,如果使用 setsid 命令启动一个子进程,那么该进程将成为一个新的会话组和进程组的领导者,从而避免了来自终端设备的信号影响。
让我们看一个例子,假设我们现在在一个终端中执行了如下指令:
$ sleep 300 &
在这里,我们使用 sleep 命令来模拟一个长时间运行的进程,并用 & 符号将其放入后台运行。在这个例子中,该进程将位于与当前 shell 进程相同的进程组中,且其会话组的领导者也是当前 shell 进程,因此如果我们在当前终端中按下 Ctrl+C 来发送中断信号,就会中断该进程的执行。
现在,我们使用 setsid 命令来启动该进程:
$ setsid sleep 300 &
这样,sleep 进程将脱离当前 shell 进程,成为一个新的会话组和进程组的领导者,其标准输出和标准错误输出将被重定向到 /dev/null 设备中,从而避免了可能的输出干扰效果。而且,如果我们在终端中按下 Ctrl+C 来发送中断信号,也不会影响到该进程的执行。
除了 setsid 命令之外,还有一些其他的命令和函数可以用来创建一个新的会话组和进程组的领导者,比如 daemon() 函数和 system() 函数等。
总之,setsid 命令是一个常用的工具,可以用来创建一个与当前 shell 进程脱离控制终端的进程,并且可以保证其在后台运行的稳定性和可靠性。