Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is it possible to signal handler to survive after "exec"?

I wrote a signal handler for a process, and fork() after that, the signal handler will be applied to both parent and child processes. If I replace the child process with "exec", the signal handler is no more.

I know this happens because "exec" call will overwrite the child process address space with it's own. I just want to know if there is a way to make signal handler work even after "exec" call ?

like image 508
aditya Avatar asked Feb 25 '10 11:02

aditya


People also ask

What happens after signal handler?

If a signal handler returns in such a situation, the program is abnormally terminated. The call to signal establishes signal handling for only one occurrence of a signal. Before the signal-handling function is called, the library resets the signal so that the default action is performed if the same signal occurs again.

Can a signal handler be interrupted?

Signal handlers can be interrupted by signals, including their own. If a signal is not reset before its handler is called, the handler can interrupt its own execution. A handler that always successfully executes its code despite interrupting itself or being interrupted is async-signal-safe.

Where does signal handler return to?

Where does the signal handler return? No, it returns to nowhere. Think about the way of handling interrupt in a kernel. In fact, once a signal is handled, the control ``returns'' to the interrupted statement.

Can a signal handler return a value?

Signal handler is like an interrupt and does not return to anyone.


1 Answers

No. From the man pages:

execve() does not return on success, and the text, data, bss, and stack of the calling process are overwritten by that of the program loaded. The program invoked inherits the calling process's PID, and any open file descriptors that are not set to close on exec. Signals pending on the calling process are cleared. Any signals set to be caught by the calling process are reset to their default behaviour. The SIGCHLD signal (when set to SIG_IGN) may or may not be reset to SIG_DFL.

In fact, if the signal handler were still active after the code had been replaced with some very different code, you could expect all sorts of mayhem when the signal occurred. The signal handler is, after all, just an address to call when something happens (discounting SIG_IGN and SIG_DFL for now). Who knows what piece of code would be at that address when you replace the entire text segment?

like image 68
paxdiablo Avatar answered Oct 10 '22 13:10

paxdiablo