00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "defs.h"
00022
00023 #ifdef FREEBSD
00024 #define sival_int sigval_int
00025 #define sival_ptr sigval_ptr
00026 #endif
00027
00028
00029 static void handler(int signum, siginfo_t *info, void *context)
00030 {
00031 printf("signal number: %d\n", info->si_signo);
00032 printf("sending process ID: %ld\n", (long)info->si_pid);
00033 printf("real user ID of sending process: %ld\n", (long)info->si_uid);
00034 switch (info->si_code) {
00035 case SI_USER:
00036 printf("Signal from user\n");
00037 break;
00038 case SI_QUEUE:
00039 printf("Signal from sigqueue; value = %d\n",
00040 info->si_value.sival_int);
00041 break;
00042 case SI_TIMER:
00043 printf("Signal from timer expiration; value = %d\n",
00044 info->si_value.sival_int);
00045 break;
00046 case SI_ASYNCIO:
00047 printf("Signal from asynchronous I/O completion; value = %d\n",
00048 info->si_value.sival_int);
00049 break;
00050 case SI_MESGQ:
00051 printf("Signal from message arrival; value = %d\n",
00052 info->si_value.sival_int);
00053 break;
00054 default:
00055 printf("Other signal\n");
00056 }
00057 }
00058
00059 int main(void)
00060 {
00061 struct sigaction act;
00062 union sigval val;
00063
00064 memset(&act, 0, sizeof(act));
00065 act.sa_flags = SA_SIGINFO;
00066 act.sa_sigaction = handler;
00067 ec_neg1( sigaction(SIGUSR1, &act, NULL) )
00068 #if _POSIX_REALTIME_SIGNALS > 0
00069 ec_neg1( sigaction(SIGRTMIN, &act, NULL) )
00070 #endif
00071 ec_neg1( kill(getpid(), SIGUSR1) )
00072 val.sival_int = 1234;
00073 #if _POSIX_REALTIME_SIGNALS > 0
00074 ec_neg1( sigqueue(getpid(), SIGRTMIN, val) )
00075 #endif
00076 exit(EXIT_SUCCESS);
00077
00078 EC_CLEANUP_BGN
00079 exit(EXIT_FAILURE);
00080 EC_CLEANUP_END
00081 }
00082