在RTP中,也可以像Kernel那样使用Signal,但略有不同
区别一:Kernel Task默认Unblock所有Signal;Kernel创建的RTP默认Unblock所有Signal;被RTP创建的RTP,继承原有RTP的Mask
/*
* 版权所有 公众号 VxWorks567
* 使用以下代码分别在Kernel和RTP里进行测试
*/
#include <stdio.h>
#include <signal.h>
#include <rtpLib.h>
#ifdef _WRS_KERNEL
void testSig(int argc)
#else
void main(int argc, char *argv[])
#endif
{
sigset_t mask;
sigprocmask(0, NULL, &mask);
printf("old mask: %#llx\n", mask);
mask = sigmask(SIGUSR1);
sigprocmask(SIG_SETMASK, &mask, NULL);
sigprocmask(0, NULL, &mask);
printf("new mask: %#llx\n", mask);
if(argc>1)
{
rtpSpawn("a.vxe", NULL, NULL, 200, 0x2000, 0, 0);
}
}
区别二:Kernel的每个Task有独立的Mask;RTP的Task共享Mask
/*
* 版权所有 公众号 VxWorks567
* 使用以下代码分别在Kernel和RTP里进行测试
*/
#include <stdio.h>
#include <signal.h>
#include <taskLib.h>
#ifdef _WRS_KERNEL
void testSig(int argc)
#else
void main(int argc, char *argv[])
#endif
{
sigset_t mask;
taskDelay(10);
sigprocmask(0, NULL, &mask);
printf("\nold mask: %#llx\n", mask);
mask = sigmask(SIGUSR1);
sigprocmask(SIG_SETMASK, &mask, NULL);
sigprocmask(0, NULL, &mask);
printf("new mask: %#llx\n", mask);
if(argc>1)
{
#ifdef _WRS_KERNEL
taskSpawn(NULL, 200, 0, 0x2000, (FUNCPTR)testSig, 0,0,0,0,0,0,0,0,0,0);
#else
taskSpawn(NULL, 200, 0, 0x2000, (FUNCPTR)main, 0,0,0,0,0,0,0,0,0,0);
taskExit(0);
#endif
}
}
区别三:Kernel Task接收到Signal后,默认是丢弃,即SIG_DFL表示“忽略Signal”;RTP接收到Signal后,默认是终止,即SIG_DFL表示“终止进程”
/*
* 版权所有 公众号 VxWorks567
* 使用以下代码分别在Kernel和RTP里进行测试
*/
#include <stdio.h>
#include <unistd.h>
static void sigHandler(int signo)
{
printf("\nsigno is %d\n", signo);
}
#ifdef _WRS_KERNEL
void testSig()
#else
void main()
#endif
{
signal(30, sigHandler);/* 仅注册30 */
printf("\nwait for signal\n");
pause();
printf("after signal\n");
}
未完待续