2009-10-03 43 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()會返回一個錯誤,因此不在前臺或後臺。