只在KSH上面测试过,APUE 里面介绍过Bsh对于job control支持得不太好,因此这个程序只对对ksh和csh是有效滴。原来实现了一个利用标准输入输出来判断的,如果程序重定向可能会有问题。这次索性利用terminal文件描述符。
实现原理:
判断当前session的terminal对应的process group同当前进程的process group是否相等。相等则表明当前进程属于foreground process group,正在前端运行,否则表示后台执行。#include "stdio.h"
#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <unistd.h>int hasTerminal()
{ int termfd = open("/dev/tty", O_RDONLY); if (termfd < 0) { return 0; } else { if (isatty(termfd) && (tcgetpgrp(termfd) == getpgrp())) { close(termfd); return 1; } else { close(termfd); return 0; } } return 0;}int main()
{ if (hasTerminal()) printf("has terminal\n"); else printf("hasn't terminal\n"); return 0;}