[net.unix-wizards] Am I in background? Isatty

rwl@uvacs.UUCP (Ray Lubinsky) (11/20/85)

> It sounds (from text not quoted here) like what you really want to know
> is whether the standard input is the user's terminal.  Phrased that
> way, you've prob'ly already realised the easy way:
> 
> #define STDIN	0
> 
> 	if (isatty(STDIN)) ...
> 
:
> 	Joe Yao		hadron!jsdy@seismo.{CSS.GOV,ARPA,UUCP}

Actually, this won't do the trick.  If the original poster wanted to know
whether the process has pipes into and out of it, then this is the method.
However, child- and parent-processes may share stdin, stdout, etc.  Try running

	#include <stdio.h>
	main() { printf("I am in the %sground.\n",(isatty(0))?"fore":"back"); }

in the background if you don't believe me.

A preferable method was posted by some time ago by (geez, I didn't save the
net address) and restated below:

	#include <sys/ioctl.h>

	foregroundp()
	{
		int	tpgrp;	/* short in 4.1, int in 4.2 */

		if (ioctl(0,TIOCGPGRP,&tpgrp))
			return(0);
		return(tpgrp == getpgrp(0));
	}

This will work for all combinations of ``backgrounding'' and I/O redirection
execpt that it incorrectly returns non-zero when you run the command from the
command line and redirect stdin.
-- 

Ray Lubinsky		     University of Virginia, Dept. of Computer Science
			     uucp: decvax!mcnc!ncsu!uvacs!rwl