Вот что я использую для программы, запускаемой из оболочки с управлением заданиями (большая часть оболочки, см. Ниже):
/* We can read from stdin if :
* - we are in foreground
* - stdin is a pipe end
*/
static int validate_stdin(void) {
pid_t fg = tcgetpgrp(STDIN_FILENO);
int rc = 0;
if(fg == -1) {
debug_printf("Piped\n");
} else if (fg == getpgrp()) {
debug_printf("foreground\n");
} else {
debug_printf("background\n");
rc = -1;
}
return rc;
}
Если в сеансе имеется управляющий терминал, на переднем плане может быть только группа процессов, а tcget / setpgrp используется для установки этого идентификатора группы процессов. Поэтому, если идентификатор вашей группы процессов не является идентификатором группы процессов группы процессов переднего плана, то вы не находитесь на переднем плане.
Работает, если в оболочке есть управление заданиями, как говорит ссылка, указанная mouviciel.
Однако это не всегда так. Например, во встроенной системе с использованием busybox оболочка может быть настроена с управлением заданиями или без него.