RTP之Signal的使用(一)

2022-12-05 15:53:34 浏览数 (1)

在RTP中,也可以像Kernel那样使用Signal,但略有不同

区别一:Kernel Task默认Unblock所有Signal;Kernel创建的RTP默认Unblock所有Signal;被RTP创建的RTP,继承原有RTP的Mask

代码语言:javascript复制
/*
 * 版权所有  公众号  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: %#llxn", mask);

    mask = sigmask(SIGUSR1);
    sigprocmask(SIG_SETMASK, &mask, NULL);

    sigprocmask(0, NULL, &mask);
    printf("new mask: %#llxn", mask);

    if(argc>1)
        {
        rtpSpawn("a.vxe", NULL, NULL, 200, 0x2000, 0, 0);
        }
    }

区别二:Kernel的每个Task有独立的Mask;RTP的Task共享Mask

代码语言:javascript复制
/*
 * 版权所有  公众号  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: %#llxn", mask);

    mask = sigmask(SIGUSR1);
    sigprocmask(SIG_SETMASK, &mask, NULL);

    sigprocmask(0, NULL, &mask);
    printf("new mask: %#llxn", 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表示“终止进程”

代码语言:javascript复制
/*
 * 版权所有  公众号  VxWorks567
 * 使用以下代码分别在Kernel和RTP里进行测试
 */

#include <stdio.h>
#include <unistd.h>

static void sigHandler(int signo)
{
    printf("nsigno is %dn", signo);
    }
#ifdef _WRS_KERNEL 
void testSig()    
#else
void main()
#endif
{
    signal(30, sigHandler);/* 仅注册30 */
    printf("nwait for signaln");
    pause();
    printf("after signaln");
    }

未完待续

0 人点赞