从C程序,如何知道进程是在前台还是后台运行?

时间:2018-05-31 08:50:49

标签: c process posix

在我的C程序中,无论我的进程(POSIX)是在后台运行还是在前台运行,我都希望有不同的行为。 我无法访问argc / argv

我正在考虑以下内容:

if (isatty(0)) {
  printf("Foreground\n");
} else {
  printf("Background\n");
}

但这对我来说并不好。我得到以下结果:

$ ./myprog &
Foreground

1 个答案:

答案 0 :(得分:1)

isatty()的{​​{3}}清楚地表明函数test whether a file descriptor refers to a terminal。当你传递'0'作为参数时,它主要是指STDIN,因此isatty()将始终返回TRUE,这意味着你的代码行为类似于

if (TRUE) {
  printf("Foreground\n");
} else {
  printf("Background\n");
}

如评论所示,检查前景与后台进程的正确方法就像这段代码

#include <unistd.h>
#include <stdio.h>

int main()
{
pid_t console_pid = tcgetpgrp(STDOUT_FILENO);
pid_t my_pid = getpgrp();
if(console_pid == my_pid)
   printf("process foregrounded\n");
else
   printf("process backgrounded\n");
return 0;
}

这是我的ubuntu机器上的输出

ubuntu@4w28n62:~$ ./a.out
process foregrounded
ubuntu@4w28n62:~$ ./a.out &
[1] 4814
ubuntu@4w28n62:~$ process backgrounded

[1]+  Done                    ./a.out