Sar*_*dhi 4 c unix linux solaris
在我的C程序中,我想知道我的可执行文件是否像这样在前台运行
$./a.out
Run Code Online (Sandbox Code Playgroud)
或者像这样
$./a.out &
Run Code Online (Sandbox Code Playgroud)
后台进程是进程组id与终端进程不同的进程; 这些过程不受键盘生成的信号的影响.只允许前台进程读取或写入终端.尝试从终端读取(写入)的后台进程由终端驱动程序发送SIGTTIN(SIGTTOU)信号,除非被捕获,否则该信号暂停该进程.
因此解决方案是安装一个信号处理程序SIGTTIN然后尝试读取stdin(关闭缓冲或它将阻止).如果你得到"0字节读取",那么你就是在前台运行.
[编辑]请注意,进程的状态可能会发生变化.您可以使用shell的作业控制命令(Ctrl-Z bg,, fg和jobs)来执行此操作.
如果你是前台工作,
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
在任何时间点.您不能指望您可以检查一次,以后它仍然是真的(或错误).
| 归档时间: |
|
| 查看次数: |
2720 次 |
| 最近记录: |