📄 pending.c
字号:
/* * POSIX.1 Signals test program * * Written by J. Vidal * Copyright (C) Dec, 2002 OCERA Consortium. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2. * * Simple program to test signal delivery order and global sigactions. * */#include <rtl.h>#include <rtl_sched.h>#define NTASKS 2static pthread_t thread[NTASKS];static int sig_rec[NTASKS];#define MAXSIGNALS_REC 100static void signal_handler(int signal){ rtl_printf("Signal handler called for signal %d\n",signal);}static void *start_routine(void *arg){ struct sched_param p; struct sigaction sa; int err,i,signal,count=0; rtl_sigset_t set; int param=(unsigned) arg; p . sched_priority =1; pthread_setschedparam (pthread_self(), SCHED_FIFO, &p); sa.sa_handler=signal_handler; sa.sa_mask=0; sa.sa_flags=0; rtl_printf("Program actions for no valid signals. Expect failure\n"); signal=RTL_SIGUSR1-1; if ((err=sigaction(signal,&sa,NULL))<0 ){ rtl_printf("sigaction(%d,&sa,NULL) FAILING, err:%d.\n",signal,err); } signal=RTL_SIGRTMAX+1; if ((err=sigaction(signal,&sa,NULL))<0 ){ rtl_printf("sigaction(%d,&sa,NULL) FAILING, err:%d.\n",signal,err); } rtl_sigfillset(&set); pthread_sigmask(SIG_BLOCK,&set,NULL); if (!param){ rtl_printf("Thread %d programing all user signals\n",param); for (i=RTL_SIGUSR1; i<=RTL_SIGRTMAX; i++){ rtl_sigdelset(&set,i); if ((err=sigaction(i,&sa,NULL))<0 ){ rtl_printf("sigaction(%d,&sa,NULL) FAILING, err:%d.\n",i,err); } } while (count<MAXSIGNALS_REC) { rtl_printf("Thread %d waiting for signals\n",param); sigsuspend(&set); count++; rtl_printf("Thread %d before killing\n",param); for (i=RTL_SIGUSR1; i<=RTL_SIGRTMAX; i++){ pthread_kill(thread[(param+1)%NTASKS],i); } } } else { rtl_printf("Thread %d programing odd user signals (overwritting previous programmed)\n",param); for (i=RTL_SIGRTMAX;i>=RTL_SIGUSR1; i-=2){ rtl_sigdelset(&set,i); if ((err=sigaction(i,&sa,NULL))<0 ){ rtl_printf("sigaction(%d,&sa,NULL) FAILING, err:%d.\n",i,err); } } while (count<MAXSIGNALS_REC) { rtl_printf("Thread %d before killing\n",param); for (i=RTL_SIGRTMAX;i>=RTL_SIGUSR1; i--){ pthread_kill(thread[(param+1)%NTASKS],i); } rtl_printf("Thread %d waiting for signals\n",param); sigsuspend(&set); count++; } } sig_rec[param]=count; rtl_sigfillset(&set); //Block thread, so all user signals are blocked. sigsuspend(&set); return 0; } int init_module(void) { int i; // Threads creation. for (i=0;i<NTASKS;i++) pthread_create (&thread[i], NULL, start_routine,(void *) i); return 0;}void cleanup_module(void) { int i; for (i=0;i<NTASKS;i++){ rtl_printf("\n thread %d has received %d signals\n",i, sig_rec[i]); pthread_delete_np (thread[i]); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -