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
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 to syslog
or some other file while daemonizing.
if (daemonize) {
//redirect all prints to syslog or some other logfile
daemon(0, 0);
}
where daemonize
can be an arguement to the application whether to go into background or not.
To answer your second part, that's usually called a daemon and they're built something like this.
main()
pid = fork()
if pid is child
run program
else we are the parent process
exit to command prompt
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With