If I used fork() and execv() to spawn several child processes running in the background and I wanted to bring one of them to the foreground, how could I do that?
I a
Complimentarily to Ignacio Vazquez-Abram's answer, I suggest that you emulate the shell foreground/background model.
As far as I can tell, backgrounding a process means suspending it. The easiest way to do this is through SIGSTOP
. When you foreground a process, send it SIGCONT
. As long as only one of your "jobs" are currently in the foreground, it will be the only one read and writing to the session's tty
.
kill(child_pid, SIGSTOP);
kill(child_pid, SIGCONT);
You may want to suspend each process after you fork
, and before you execv
, and give the user of your shell the option to foreground them later to maintain the invariant.
if (!fork()) { // we are the child
raise(SIGSTOP); // suspend self
execv(...); // run the command (after we've been resumed)
Here are some related links I found: