You didn't specify an operating system. I am going to assume that you have access to GNU ps.
Suppose the bash session PID is, for example, 1857. Then, to find out which processes are in foreground and background in that session, run:
$ ps -O stat --ppid 1857
PID STAT S TTY TIME COMMAND
1908 S S pts/4 00:00:00 sleep 30m
2071 S+ S pts/4 00:00:00 man ps
Look at the STAT column. The + suffix identifies foreground processes. The other processes are background.
In the example above, sleep 30m is in the background in that shell (status is plain S) while man ps is in the foreground (status is S+).
How it works:
The ps STAT field in detail
man ps provides details on how to interpret the status field:
PROCESS STATE CODES
Here are the different values that the s, stat and state output specifiers (header "STAT" or "S") will display to describe the state
of a
process:
D uninterruptible sleep (usually IO)
R running or runnable (on run queue)
S interruptible sleep (waiting for an event to complete)
T stopped, either by a job control signal or because it is being traced
W paging (not valid since the 2.6.xx kernel)
X dead (should never be seen)
Z defunct ("zombie") process, terminated but not reaped by its parent
For BSD formats and when the stat keyword is used, additional characters may be displayed:
< high-priority (not nice to other users)
N low-priority (nice to other users)
L has pages locked into memory (for real-time and custom IO)
s is a session leader
l is multi-threaded (using CLONE_THREAD, like NPTL pthreads do)
+ is in the foreground process group
You are interested in whether a process is foreground, the last item is key: + signifies a foreground process.