I have attached the new version. But it seems both Linux and and netbsd will process signal with large signo number first.
2016-07-23 23:44 GMT-07:00 Christos Zoulas <chris...@zoulas.com>: > On Jul 23, 8:03pm, charles.cui1...@gmail.com (Charles Cui) wrote: > -- Subject: Re: updates? > > | Hi Christos, > | > | I have attached a program to test the delivery order of signals. > | It turns out that both Linux and our current implementation use a FIFO > | policy to deliver signal, (1. only realtime signals and 2. mix of > realtime > | signals and standard signals) > | I do not know how FreeBSD handles it. > | Let me know if there are any problems. > > Ok good start. Let's add more things in the queue (or split it into > separate tests) to show that: > - realtime signals are ordered properly > - you can queue more than one realtime signal > - don't use sighold/sigrelse. these are obsolete and release > only one signal at a time. use sigprocmask (plus since you are > releasing them one at a time, the release order is the order > you are going to see them delivered. > > Then we can turn it into an ATF test. > > Thanks, > > christos >
#include <signal.h> #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <errno.h> #define CNT 5 void myhandler(int signo, siginfo_t *info, void *context) { printf ("Inside Handler = %d\n", signo); } int main() { int pid, i; long syslimit; union sigval value; struct sigaction act; int signals[CNT] = {SIGINT+2, SIGRTMIN+1, SIGINT, SIGRTMIN + 0, SIGRTMIN+2}; act.sa_flags = SA_SIGINFO; act.sa_sigaction = myhandler; sigemptyset(&act.sa_mask); for (i = 0; i <CNT; i++) sigaction(signals[i], &act, 0); value.sival_int = 0; pid = getpid(); sigset_t mask, orig; sigemptyset(&mask); for (i = 0; i<CNT; i++) sigaddset(&mask, signals[i]); if (sigprocmask(SIG_BLOCK, &mask, &orig) < 0) { printf("error in sigprocmask when blocking\n"); return -1; } for (i=0; i<CNT; i++) { if (sigqueue(pid, signals[i], value) != 0) { printf("call to sigqueue did not return success\n"); } } if (sigprocmask(SIG_UNBLOCK, &mask, &orig) < 0) { printf("error in sigprocmask when unblocking\n"); return -1; } sleep(3); return 0; }