I have one simple program that’s using Qt Framework.
It uses QProcess to execute RAR and compress some files. In my program I am catching SIGINT and doing something in my code when it occurs:
signal(SIGINT, &unix_handler);
When SIGINT occurs, I check if RAR process is done, and if it isn’t I will wait for it … The problem is that (I think) RAR process also gets SIGINT that was meant for my program and it quits before it has compressed all files.
Is there a way to run RAR process so that it doesn’t receive SIGINT when my program receives it?
Thanks
If you are generating the
SIGINTwith Ctrl+C on a Unix system, then the signal is being sent to the entire process group.You need to use setpgid or setsid to put the child process into a different process group so that it will not receive the signals generated by the controlling terminal.
[Edit:]
Be sure to read the RATIONALE section of the
setpgidpage carefully. It is a little tricky to plug all of the potential race conditions here.To guarantee 100% that no
SIGINTwill be delivered to your child process, you need to do something like this:Strictly speaking, every one of these steps is necessary. You have to block the signal in case the user hits Ctrl+C right after the call to
fork. You have to callsetpgidin the child in case theexeclhappens before the parent has time to do anything. You have to callsetpgidin the parent in case the parent runs and someone hits Ctrl+C before the child has time to do anything.The sequence above is clumsy, but it does handle 100% of the race conditions.