I am writing a shell in C that does a basic job control. My observations from the bash shell are that when the fg [%]id
command is run, it can bring two types of jobs into the foreground.
- Stopped jobs (Signaled using
Ctrl+Z
)
- Jobs running in the background
My current implementation of the shell is such that whenever the program starts, the shell running in the foreground is made to ignore all signals. Whenever a child process gets forked, each of the processes that are not background specified (using &), get default signal handlers. The result of this is that the shell ignores all the signals and all other foreground processes intercept the signals correctly.
When a foreground job that has been stopped is resumed, the signals still get intercepted and everything works as expected. I have made use of tcsetpgrp()
to switch the shell when any foreground process is running and switch it back when the program completes execution.
The way my implementation handles background processes is that when they are forked by the shell, they are made to ignore all signals. Now, when a running background process is brought back to the foreground, it retains it;s signal handlers and thus ignores all the signals passed to it.
Is there any way to change the signal action of that particular process from the parent process i.e. the shell. I read up on sigaction()
and kill()
system calls, both of which are not useful in this case.
Any help or suggestions please.
question from:
https://stackoverflow.com/questions/65926549/bringing-a-running-background-process-to-the-foreground-in-a-shell 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…