函数获取当前进程UNIX的终端文件描述符

函数获取当前进程UNIX的终端文件描述符,unix,Unix,我想使用函数: pid_t tcgetpgrp(int fildes); 如何检索fildes(要传递给此函数) 此函数返回的进程组id是否与 getpgrp(0)//0 for the calling process ?您需要将文件描述符编号附加到当前终端。例如,您可以从unistd.h使用0或STDIN\u FILENO,您可以将任何打开的文件描述符传递给终端;该调用将检索有关该终端的信息。一个进程可能有多个终端可以使用的文件描述符,但其中最多有一个是进程的控制终端。事实上,给定的终端可

我想使用函数:

pid_t tcgetpgrp(int fildes);
如何检索fildes(要传递给此函数)

此函数返回的进程组id是否与

getpgrp(0)//0 for the calling process

您需要将文件描述符编号附加到当前终端。例如,您可以从
unistd.h
使用0或
STDIN\u FILENO
,您可以将任何打开的文件描述符传递给终端;该调用将检索有关该终端的信息。一个进程可能有多个终端可以使用的文件描述符,但其中最多有一个是进程的控制终端。事实上,给定的终端可能没有与其相关联的进程组,而它是控制终端(尽管在这种情况下它相对不太可能被打开)

Michiel Buddingh从
中建议
STDIN\u FILENO
(这通常是编写0的一种奇特方式);这样做的问题是,程序可以将标准输入从文件重定向,或者将输入通过管道传输到文件,在这种情况下,标准输入不是终端。类似的注意事项也适用于标准文件号(又名1)。因此,最好使用的描述符通常是
STDERR\u FILENO
(aka 2);这是最不可能被重定向的


问题的后半部分是“tcgetpgrp()是否返回与
getpgrp()
相同的值?”。答案是‘不’。每个进程都属于一个进程组,
getpgrp()
将可靠地标识该组。不是每个进程都有一个控制终端,也不是每个文件描述符都标识一个终端,因此
tcgetpgrp()
可以返回错误ENOTTY。此外,当
tcgetpgrp()
确实返回值时,它是与终端关联的当前前台进程组的值,该值不一定与当前进程的进程组相同,当前进程组可能是与终端关联的后台进程组的一部分。当前的前台进程组也可以随时间变化。

通常标准输入、输出和/或错误(0、1或2)将连接到控制终端。当然,只需打开/dev/tty,如果您有控制终端,它将始终是控制终端。从open()返回的文件描述符可以传递给tcgetpgrp(),如果不再需要,可以关闭它

函数的作用是:返回前台进程组id,而getpgrp()返回您的进程组id。如果您的进程在前台,则返回相同的进程组id;如果您的进程在后台,则返回不同的进程组id。如果进程没有控制终端,因此不在前台或后台,则tcgetpgrp()将返回错误