2 questions:
1) Is there any Linux/Posix API to know if a process has been invoked as a background process?
linux> myprogram &
Can the code for myprogram
detect that it has been invoked to run in the background (via &
) ?
2) Is there any Linux/Posix API to make a process run in the background even if it has been started as a foreground process? I.E. somehow 'detach' from the shell at runtime.. (either detach itself from the shell completely, or run as a background process of the shell).
linux> myprogram
**** starting myprogram as a background job ****
linux>
The shell prompt should come right back to me since myprogram
has detached from the shell and is running in the background
You might want to read the tty(4) man page. From what I understand, a process in the background does not have any
/dev/tty
(soopen
-ing that file would fail).The
TIOCNOTTY
ioctl should detach the calling process from its controlling terminal.You might be interested by the isatty(3) function (e.g. to detect that your stdin or stdout is or not a terminal).
A process is in the background if its parent shell process isn't suspended (waiting), which you can check through the PID.
To put a process in the background (detach it completely from the shell at runtime), you use the daemon(3) function.
To answer your second part, that's usually called a daemon and they're built something like this.
1) there are two ways to know whether a process in background
have a signal handler for
SIGTTIN /SIGTTOUT
and do a non-blocking read/write depending on which signal handler(stdin/stdout).check the process-group and match it with the terminals'
getpgrp() == tcgetpgrp(STDOUT_FILENO)
you will need to repeat the check, as the process can be foregrounded or backgrounded anytime.
2) There is a
daemon
function to put the process in background. its advisable to redirect the application prints tosyslog
or some other file while daemonizing.where
daemonize
can be an arguement to the application whether to go into background or not.