gpt4 book ai didi

c - 为什么组长无法在 Linux 中创建 session

转载 作者:太空狗 更新时间:2023-10-29 11:04:17 25 4
gpt4 key购买 nike

为什么组长无法创建 session 。但是,除了能够创建 session 的组长之外?

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

main() {

int pid;
int ppid=getppid();

if ( setsid() < 0)
perror("ERROR");

if((pid=fork()) == 0)
{
printf("proces1=%d %d\n",getpid(),getpgrp());
int s=getpgrp();

//setpgid(pid,pid);
if (setpgid(pid,0) < 0)
perror("ERROR");

printf("group after proces=%d %d\n",getpid(),getpgrp());
exit(0);
}

wait(0);
printf("group after proces=%d %d\n",getpid(),getpgrp());
}

请解释。

最佳答案

简答

在进程组领导中禁止 setsid() is required通过 POSIX:

The setsid() function shall create a new session, if the calling process is not a process group leader.

需要确保进程组的所有成员都是同一 session 的成员

长答案

进程组ID是进程组组长的PID。 session ID 是 session 领导者的 PID。 setsid() 调用成功后,进程组 ID、 session ID 和 PID 应该相同。

但是对于进程组组长来说,进程组ID已经等于PID了。如果它能够调用 setsid(),它的进程组 ID 将保持不变,因此:

  • process group leader属于新session;
  • 其他进程组成员属于老 session 。

因此,在这种情况下,我们有一个进程组,其成员属于不同的 session 。 POSIX 想要禁止这种情况。

为什么?

进程组和 session 是为作业控制而发明的。进程组用于确定前台和后台组,以便前台组接收来自终端的信号。

为实现这一点,终端会跟踪其当前的前台进程组,并在发生某些事件时向该组发送信号。

但这假设来自任何给定进程组的所有进程共享相同的控制终端,因此终端发送的信号对它们有意义。

控制终端由以下规则共享:

  • 来自同一 session 的所有进程共享同一个控制终端;
  • 来自不同 session 的进程不能共享同一个控制终端。

因此,如果我们要求进程组的所有成员共享同一个控制终端,我们也应该要求他们是同一 session 的成员。 p>

引用

参见“Linux 编程接口(interface)”,第 34 章(进程组、 session 和作业控制)。

关于c - 为什么组长无法在 Linux 中创建 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27523451/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com