9.信号-非同期通信方式//RT-Threadカーネルプログラミングによる学習記録(非カーネル実装)
3449 ワード
信号、信号は一般的なIPC変数とは異なり、信号は初期化する必要はなく、削除する必要もない.信号にはインストール、監視、送信、応答の操作があります.なぜインストール操作がないのかというと、信号の大部分はシステムで使用されており、すでに作成されており、信号ルームメイトの具体的な記号、例えば私たちが使用できるSIGUSR 1、SIGUSR 2である.私たちが自分で定義できる部分もあります.
1.信号の取り付け
2.信号の監視
3.信号の送信
4.信号の応答
5.ルーチン
/*
* Each of the following macros expand to a positive integral constant
* expression that is the signal number corresponding the the specified
* condition.
*/
#define SIGABRT 1 /* abort */
#define SIGFPE 2 /* arithmetic exception */
#define SIGILL 3 /* illegal instruction */
#define SIGINT 4 /* attention request from user */
#define SIGSEGV 5 /* bad memory access */
#define SIGTERM 6 /* termination request */
#endif
/* (these following macros are not part of the ANSI standard,
* but private to this implementation)
*/
#define SIGSTAK 7 /* stack overflow */
#define SIGRTRED 8 /* run-time redirection error */
#define SIGRTMEM 9 /* run-time memory error */
/* Signal numbers 10 and 11 are available for the user */
#define SIGUSR1 10
#define SIGUSR2 11
#define SIGPVFN 12 /* pure virtual function called */
#define SIGCPPL 13 /* miscellaneous exception from C++ library */
#define SIGOUTOFHEAP 14 /* ::operator new or new[] cannot allocate memory */
/* Signal numbers 15-31 are reserved to the implementation */
/* Signal numbers 32 and larger are for more user signals */
/* , 32 */
//
#define sig_mask(sig_no) (1u << sig_no)
#define sig_valid(sig_no) (sig_no >= 0 && sig_no < RT_SIG_MAX)
1.信号の取り付け
/* */
rt_signal_install(SIGUSR1, Signal_Handler_Function);
/* Signal_Handler_Function */
2.信号の監視
/* */
rt_signal_unmask(SIGUSR1);
//SIGUSR1 ,
/*
/* Signal numbers 10 and 11 are available for the user */
#define SIGUSR1 10
#define SIGUSR2 11
*/
3.信号の送信
/* */
rt_thread_kill(tid1, SIGUSR1);
/*tid1 ,SIGUSR1 */
4.信号の応答
/* */
void Signal_Handler_Function(int sig)
{
//sig
}
/* IPC, */
// , ,
5.ルーチン
/*
* :
*
* , , 。
*
*/
#include
#define THREAD_PRIORITY 25
#define THREAD_STACK_SIZE 512
#define THREAD_TIMESLICE 5
static rt_thread_t tid1 = RT_NULL;
/* 1 */
void thread1_signal_handler(int sig)
{
rt_kprintf("thread1 received signal %d
", sig);
}
/* 1 */
static void thread1_entry(void *parameter)
{
int cnt = 0;
/* */
rt_signal_install(SIGUSR1, thread1_signal_handler);
rt_signal_unmask(SIGUSR1);
/* 10 */
while (cnt < 10)
{
/* 1 , */
rt_kprintf("thread1 count : %d
", cnt);
cnt++;
rt_thread_mdelay(100);
}
}
/* */
int signal_sample(void)
{
/* 1 */
tid1 = rt_thread_create("thread1",
thread1_entry, RT_NULL,
THREAD_STACK_SIZE,
THREAD_PRIORITY, THREAD_TIMESLICE);
if (tid1 != RT_NULL)
rt_thread_startup(tid1);
rt_thread_mdelay(300);
/* SIGUSR1 1 */
rt_thread_kill(tid1, SIGUSR1);
return 0;
}