2009-10-03 42 views
2

的终端文件描述符我想使用的功能:函数来获取当前进程UNIX

pid_t tcgetpgrp(int fildes); 

如何检索菲尔德斯(要传递给此功能)。

而由该函数返回的进程组ID是相同一个由

getpgrp(0)//0 for the calling process 

返回??

回答

3

您可以传递任何打开的文件描述符给终端;该呼叫将检索关于该终端的信息。一个进程可能有文件描述符对多个终端开放,但其中至多有一个是进程的控制终端。事实上,给定的终端可能没有与其相关的进程组,但它是控制终端(尽管在这种情况下相对不太可能被打开)。

Michiel Buddingh建议STDIN_FILENO<unistd.h>(这通常是一种奇特的写作方式0);这样做的麻烦在于,程序可能会将标准输入从文件重定向到输入或输入到输入,在这种情况下,标准输入不是终端。类似的考虑适用于STDOUT_FILENO(aka 1)。因此,最好使用的描述符通常是STDERR_FILENO(aka 2);这是最不可能被重定向的。

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

0

您需要附加到当前终端的文件描述符编号。例如,您可以从unistd.h使用0或STDIN_FILENO

5

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

tcgetpgrp()函数返回前台进程组标识,而getpgrp()返回进程组标识。如果您的流程处于前台,它们将是相同的,或者如果您的流程处于后台,则它们将会相同。如果您的进程没有控制终端,tcgetpgrp()会返回一个错误,因此不在前台或后台。