语法:
pid_t tcgetpgrp(int fd);
在MAN页面中:
函数tcgetpgrp()返回与fd关联的终端上前台进程组的进程组ID,fd必须是调用进程的控制终端。
因此,使用此函数可以获取终端的前台进程。但我不明白传递给此函数的文件描述符是什么。传递给此函数的文件描述符有何用途以及为什么要传递?
《开放组基本规范第6版IEEE Std 1003.1, 2004 Edition》中提到:
11.1.2 进程组
终端可能与前台进程组相关联。这个前台进程组在处理产生信号的输入字符时起着特殊作用,如“特殊字符”中所讨论的那样。
tcgetpgrp
是一个函数,可以返回与给定终端关联的该组的ID。参数必须是与终端关联的文件描述符,而且必须是进程的控制终端的描述符:
11.1.3 控制终端
终端可能属于进程作为其控制终端。拥有控制终端的会话的每个进程都有相同的控制终端。
简而言之,控制终端是让您管理Shell作业的对象:使用CTRL-Z暂停作业,使作业成为前台作业,使用CTRL-C取消作业等。控制终端允许您控制附加到此终端的进程组。此控制可能包括:对终端的并发访问、会话管理、前台/后台等。
ctermid
可以返回您的控制终端的路径(tty
命令行也可以)。请注意,控制终端可能与您进行标准I/O的终端不同,但通常是相同的。然后,您可以(非常常见地)使用STDIN_FILENO(以及其他两个文件描述符)。您还可以使用isatty
来确定文件描述符是否与终端相关联。
#include <unistd.h>
pid_t pid = tcgetpgrp(STDIN_FILENO);
STDIN_FILENO
,STDOUT_FILENO
或STDERR_FILENO
。 - Paul R
unistd.h
)。标准将STDIN_FILENO定义为0,因此可以使用0来代替它。 - Jean-Baptiste Yunès