C语言中的tcgetpgrp函数

3

语法:

   pid_t tcgetpgrp(int fd);

在MAN页面中:

函数tcgetpgrp()返回与fd关联的终端上前台进程组的进程组ID,fd必须是调用进程的控制终端。

因此,使用此函数可以获取终端的前台进程。但我不明白传递给此函数的文件描述符是什么。传递给此函数的文件描述符有何用途以及为什么要传递?

2个回答

2

《开放组基本规范第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来确定文件描述符是否与终端相关联。


在存在STDIN_FILENO宏的情况下,我应该使用0代替这个宏吗? - mohangraj
1
由于您正在使用Unix系统,因此应该可以使用STDIN_FILENO(包括unistd.h)。标准将STDIN_FILENO定义为0,因此可以使用0来代替它。 - Jean-Baptiste Yunès

1
你可以这样调用它:

#include <unistd.h>

pid_t pid = tcgetpgrp(STDIN_FILENO);

1
OK。这不是问题。我的需求是,fd在这个函数中的用途是什么?它指的是哪里? - mohangraj
这只是进程的stdio文件号 - 您可以根据需要传递STDIN_FILENOSTDOUT_FILENOSTDERR_FILENO - Paul R
你还没有理解我的问题。我已经有了答案。我的需求是为什么我们需要将STDIN_FILENO作为参数传递。以及将该参数传递给该函数的用途是什么。 - mohangraj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接