Dear all,

I'm trying to handle signals inside a MPI task farming model. Following is
a pseudo-code of what i'm trying to achieve:

volatile sig_atomic_t unexpected_error_occurred = 0;
void my_handler( int sig ){
    unexpected_error_occurred = 1;}
//// somewhere in the code...//
signal(SIGTERM, my_handler);
if (root process) {

    // do stuff

    if ( unexpected_error_occurred ) {

        // save something

        // reraise the SIGTERM again, but now with the default handler
        signal(SIGTERM, SIG_DFL);
        raise(SIGTERM);
    }}else { // slave process

    // do different stuff

    if ( unexpected_error_occurred ) {

        // just propragate the signal to the root
        signal(SIGTERM, SIG_DFL);
        raise(SIGTERM);
    }}
signal(SIGTERM, SIG_DFL);                       // reassign default handler
// continues the code...


As can be seen, the signal handling is required for implementing a restart
feature. All the problem resides in the assumption i made that all
processes in the communicator will receive a SIGTERM as a side effect. Is
it a valid assumption? How the actual MPI implementation deals with such
scenarios?

I also tried to replace all the raise() calls by MPI_Abort(), which
according to the documentation (
http://www.open-mpi.org/doc/v1.5/man3/MPI_Abort.3.php), sends a SIGTERM to
all associated processes. The undesired behaviour persists: when killing a
slave process, the save section in the root branch is not executed.

Appreciate any help,
Júlio.

Reply via email to