Even this method of raising signal from user to mpiexec results in signal handling by only one process. I've modified my earlier example where each process publishes its pid, and I capture the pid and raise the signal using 'kill -SIGUSR1 <pid>' from another terminal.
// test.c void handle_signal(int signal){ if(SIGNAL==SIGUSR1) printf("received SIGUSR1 signal \n"); } int main(){ MPI_Init(NULL, NULL); int my_rank; MPI_Comm_rank(MPI_COMM_WORLD, &my_rank); signal(SIGUSR1, handle_signal); printf("My pid is: %d\n", getpid()); for (;;) { printf("\nSleeping for 10 seconds\n"); sleep(10); MPI_Finalize(); } When I run with 3 processes using mpirun -np 3 ./test, I expect the statement 'received SIGUSR1 signal' twice, but it prints just once. What am I missing here? On 25 July 2017 at 11:17, r...@open-mpi.org <r...@open-mpi.org> wrote: > I’m afraid we don’t currently support that use-case. We forward signals > sent by the user to mpiexec (i.e., the user “hits” mpiexec with a signal), > but we don’t do anything to support an application proc attempting to raise > a signal and asking it to be propagated. > > If you are using OMPI master, or the soon-to-be-released v3.0, then you > might be able to do what you seek using the PMIx event notification system. > > On Jul 25, 2017, at 10:15 AM, Marc Cooper <marccooper2...@gmail.com> > wrote: > > Hi all, > > I'm working to understand signal handling in OpenMPI. I read that "Open > MPI will forward SIGUSR1 and SIGUSR2 from mpiexec to the other > processes". My question is that is this feature enabled by default > installation. > > The scenario is that one MPI process raises a SIGUSR1, which has to be > detected by 'orted' which is then forwarded to other processes. > > In my test code, I define a custom signal handler for SIGUSR1 and register > this signal handler accordingly. I send a signal by using kill() or > raise(). I assume that ORTE daemon will receive this signal and has to > forward this signal to the remaining processes. > > // test.c > > void handle_signal(int signal){ > if(SIGNAL==SIGUSR1) > printf("received SIGUSR1 signal \n"); > } > int main(){ > MPI_Init(NULL, NULL); > > int my_rank; > MPI_Comm_rank(MPI_COMM_WORLD, &my_rank); > > signal(SIGUSR1, handle_signal); > > if(my_rank == 1) // process with rank 1 raises SIGUSR1 > kill(getpid(), SIGUSR1); > > MPI_Finalize(); > } > > If I run this as > mpirun -np 3 ./test > > I would expect to have the statement printed twice from the other two > processes. But when I run this code, it only prints once, and that too from > ORTE HNP, unlike the application processes. Do I need to call any other API > on orted explicitly pass this signal, so that the application processes > receive the SIGUSR1. > > - > Marc > _______________________________________________ > users mailing list > users@lists.open-mpi.org > https://rfd.newmexicoconsortium.org/mailman/listinfo/users > > > > _______________________________________________ > users mailing list > users@lists.open-mpi.org > https://rfd.newmexicoconsortium.org/mailman/listinfo/users >
_______________________________________________ users mailing list users@lists.open-mpi.org https://rfd.newmexicoconsortium.org/mailman/listinfo/users