【发布时间】:2018-07-19 12:29:54
【问题描述】:
问题
tcgetpgrp 的手册页说
当 fd 引用调用进程的控制终端时,函数 tcgetpgrp() 将返回该终端的前台进程组 ID(如果有),并且 一些大于 1 的值,否则当前不是进程组 ID。
-
some value是什么意思,好像有歧义 - 如何检查它是一个有效的组 id 还是其他值,这是否意味着我必须获取系统中所有进程组的列表才能确定返回值是否引用了一个有效的进程组?
上下文
当我尝试使用它时,我发现它似乎返回了当前会话 ID 我已经尝试了很多次,它总是返回当前会话 id
some value 是指当前会话 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;
}
【问题讨论】:
-
手册说“进程的会话 ID 是会话领导者的进程组 ID。”它告诉你终端的进程组是会话领导进程组。即,会话 ID 始终也是有效的进程组 ID。
-
您的代码示例不完整(
main在哪里?)并且不清楚您是如何运行它的(为什么输出会出现在 shell 提示符之后?)。后者尤其会影响输出。 -
合理,当父进程退出时,没有前台进程,终端控制返回shell,是否有可能返回bash进程的pgid? @本
-
某个大于 1 且当前不是进程组 ID 的值表示大于 1 的数字(可能的有效进程组 ID)但不是进程组 ID,因为系统没有具有该 ID 的进程组。这就是明显模棱两可的句子的明确含义。
标签: c linux system-calls