的终端文件描述符我想使用的功能:函数来获取当前进程UNIX
pid_t tcgetpgrp(int fildes);
如何检索菲尔德斯(要传递给此功能)。
而由该函数返回的进程组ID是相同一个由
getpgrp(0)//0 for the calling process
返回??
的终端文件描述符我想使用的功能:函数来获取当前进程UNIX
pid_t tcgetpgrp(int fildes);
如何检索菲尔德斯(要传递给此功能)。
而由该函数返回的进程组ID是相同一个由
getpgrp(0)//0 for the calling process
返回??
您可以传递任何打开的文件描述符给终端;该呼叫将检索关于该终端的信息。一个进程可能有文件描述符对多个终端开放,但其中至多有一个是进程的控制终端。事实上,给定的终端可能没有与其相关的进程组,但它是控制终端(尽管在这种情况下相对不太可能被打开)。
Michiel Buddingh建议STDIN_FILENO
从<unistd.h>
(这通常是一种奇特的写作方式0);这样做的麻烦在于,程序可能会将标准输入从文件重定向到输入或输入到输入,在这种情况下,标准输入不是终端。类似的考虑适用于STDOUT_FILENO
(aka 1)。因此,最好使用的描述符通常是STDERR_FILENO
(aka 2);这是最不可能被重定向的。
问题的下半部分是'tcgetpgrp()
返回与getpgrp()
相同的值'。答案是不'。每个进程都属于一个进程组,并且getpgrp()
将可靠地识别该组。并非每个进程都有一个控制终端,并且不是每个文件描述符都标识一个终端,因此tcgetpgrp()
可以返回错误ENOTTY。此外,当tcgetpgrp()
确实返回值时,它是与终端相关联的当前前台进程组的值,其明显不一定与当前进程的进程组相同,该进程组可能是关联的后台进程组的一部分与终端。当前的前台进程组也可以随时间变化。
您需要附加到当前终端的文件描述符编号。例如,您可以从unistd.h
使用0或STDIN_FILENO
。
通常将标准输入,输出和/或错误(0,1或2)连接到控制终端。可以肯定的是,只要打开/ dev/tty,如果你有一个控制终端,它将一直是控制终端。从open()返回的文件描述符可以传递给tcgetpgrp(),然后在不再需要时关闭。
tcgetpgrp()函数返回前台进程组标识,而getpgrp()返回进程组标识。如果您的流程处于前台,它们将是相同的,或者如果您的流程处于后台,则它们将会相同。如果您的进程没有控制终端,tcgetpgrp()会返回一个错误,因此不在前台或后台。