gpt4 book ai didi

c - tcgetpgrp() 返回值是什么意思?

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

问题

tcgetpgrp 的手册页说

When fd refers to the controlling terminal of the calling process, the function tcgetpgrp() will return the foreground process group ID of that terminal if there is one, and some value larger than 1 that is not presently a process group ID otherwise.

  1. some value是什么意思,好像有歧义
  2. 我如何检查它是有效的组 ID 还是其他值,这是否意味着我必须获取系统中所有进程组的列表才能确定返回值是否指向有效的进程组?

上下文

当我尝试使用它时,我发现它似乎返回当前 session ID我已经尝试了很多次,它总是返回当前 session ID

enter image description here

some value 是指当前 session ID 吗?还是特例?或者我的代码有错误?

环境和代码

环境:libc 2.1.2,Linux 2.6.32

代码:

int main(int argc, char *argv[]) 
{
return getgroup(argc, argv);
}

int getgroup(int argc, char *argv[])
{
if (fork()) {
return OK;
}
sleep(5);
printf("process %d fork, ppid %d, pgid %d, psid %d \n", getpid(), getppid(), getpgid(getpid()), getsid(getpid()));
pid_t gid = tcgetpgrp(STDIN_FILENO);
printf("group id %d \n", gid);
return OK;
}

最佳答案

  1. what is the meaning of some value, it seems to be ambiguous

这就是它所说的意思,我认为:一些(任意)值不是进程组 ID。 (很可能它实际返回的是在它终止之前作为前台组的进程组 ID;这在实践中不太可能是可见的,因为 shell 通常会在其子进程之前立即将另一个进程设置为前台进程在前台终止)。

  1. how can i check it to be a valid group id or a other value, does it mean that I have to get the list of all the process groups in the system to figure out if the return value refers to a valid process group?

您可以使用带有负参数的kill 来向进程组发出信号(发出信号的进程组将是参数的绝对值),并使用信号编号 0。这将返回 - 1,如果进程组不存在,errno 设置为 ESRCH,如果存在,则不执行任何操作(并返回 0)。

(也可以使用killpg,但是手册页没有记录使用信号编号 0 的可能性,所以我不确定)。

然而,存在竞争条件:进程组可能在调用 tcgetgrp 时已经存在,但自此终止;相反,它可能不存在,但具有相同 ID 的新进程组可能已经存在。这使得它实际上只对检查当前进程控制的进程组有用(即它可以防止收割) - 特别是,由当前进程的子进程领导的组(或由当前进程本身领导的组)。

如果这看起来有局限性,请考虑:在什么情况下您实际上需要知道哪个进程组在前台,为什么?

关于c - tcgetpgrp() 返回值是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51422746/

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