一、前台进程组、后台进程组
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环境高级编程》笔记