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

时间:2009-10-03 12:17:31

标签: unix

我想使用功能:

pid_t tcgetpgrp(int fildes);

如何检索fildes(传递给此函数)。

此函数返回的进程组ID与

返回的进程组ID相同
getpgrp(0)//0 for the calling process

...

3 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:3)

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

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

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

答案 2 :(得分:0)

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