一、前臺進程組、后臺進程組
cat | cat &
cat | cat | cat
輸出結果:
?
二、主要函數應用
1. tcgetpgrp函數原型:
#include <unistd.h>
pid_t tcgetpgrp(int fd);返回值:若成功,返回前臺進程組ID, 若出錯,返回-1
分析:tcgetpgrp函數返回前臺進程組ID, 它與在fd打開的終端相關聯
?
2. tcsetpgrp函數原型:
#include <unistd.h>
pid_t setgetpgrp(int fd);返回值:若成功,返回0, 若出錯,返回-1
分析:如果進程有一個控制終端,則該進程可以調用tcsetpgrp將前臺進程組ID設置為pgrpid。pgrpid的值應當是在同一會話中的一個進程組的ID,fd必須引用該會話的控制終端。
?
3. tcgetsid函數原型:
#include <termios.h>
pid_t tcgetsid(int filedes); 若成功則返回會話首進程進程組ID,出錯則返回-1.
分析:給出控制tty的文件描述符,應用程序能獲得會話首進程的進程組ID
?
三、程序清單
測試代碼:
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <termios.h>
#include <fcntl.h>void judge(void)
{pid_t pid;pid = tcgetpgrp(STDIN_FILENO);if (pid == -1) {perror("tcgetpgrp");return;}else if (pid == getpgrp()) {printf("foreground\n");} else {printf("background\n");}
}int main(void)
{pid_t spid;printf("tcgetsid:%d,pgrp=%d,sid=%d\n", tcgetsid(STDIN_FILENO), getpgrp(), getsid(getpid()));spid = tcgetsid(STDIN_FILENO);signal(SIGTTOU, SIG_IGN);judge();int result;result = tcsetpgrp(STDIN_FILENO, getpgrp());if (result == -1) {perror("tcsetpgrp");return -1;}judge();result = tcsetpgrp(STDIN_FILENO, spid);return 0;
}
輸出結果:
?
三、參考資料
1. 《UNIX環境高級編程》筆記