我怎么知道C程序的可执行文件是在前台还是后台运行?

Sar*_*dhi 4 c unix linux solaris

在我的C程序中,我想知道我的可执行文件是否像这样在前台运行

$./a.out
Run Code Online (Sandbox Code Playgroud)

或者像这样

$./a.out &
Run Code Online (Sandbox Code Playgroud)

Aar*_*lla 7

Bash参考手册:作业控制基础知识:

后台进程是进程组id与终端进程不同的进程; 这些过程不受键盘生成的信号的影响.只允许前台进程读取或写入终端.尝试从终端读取(写入)的后台进程由终端驱动程序发送SIGTTIN(SIGTTOU)信号,除非被捕获,否则该信号暂停该进程.

因此解决方案是安装一个信号处理程序SIGTTIN然后尝试读取stdin(关闭缓冲或它将阻止).如果你得到"0字节读取",那么你就是在前台运行.

[编辑]请注意,进程的状态可能会发生变化.您可以使用shell的作业控制命令(Ctrl-Z bg,, fgjobs)来执行此操作.


eph*_*ent 6

如果你是前台工作,

getpgrp() == tcgetpgrp(STDOUT_FILENO)
Run Code Online (Sandbox Code Playgroud)

或者STDIN_FILENO或者STDERR_FILENO您附带到控制终端的文件描述符.(如果您不确定,open("/dev/tty")将始终为您的控制终端提供文件描述符(如果存在).)

这就是openssh所做的,SIGTTIN/SIGTTOU如果你只是想快速检查,它比处理容易一些.

另一方面,你可能已经背景

$ ./a.out
^Z
[1]+  Stopped                 ./a.out
$ bg
[1]+ ./a.out &

或前瞻性的

$ fg
./a.out

在任何时间点.您不能指望您可以检查一次,以后它仍然是真的(或错误).