1.适用范围

  本文档适用于希望了解SylixOS下kill 15信号的工程师。

2.SylixOS与Linux的现象差异

2.1 构建测试用例

  构建一个简单的测试用例,主线程与子线程均运行20秒后结束,程序代码如程序清单 2.1所示:

程序清单 2.1  构建测试用例

void *fun(void *arg)

{

    int n = 0;

    while(n < 20) {

        printf("pthread still alive : \tn = %d\n", n++);

        sleep(1);

    }

    pthread_exit(NULL);

    return (NULL);

}

int main (int argc, char *argv[])

{

    pthread_t tid;

    pthread_create(&tid, NULL, fun, (void *)NULL);

    int m = 0;

    while(m < 20) {

        printf("main still alive : \tn = %d\n", m++);

        sleep(1);

    }

    pthread_join(tid, NULL);

    return (0);

}


2.2 测试kill 15信号

  将测试用例编译运行在SylixOS系统和Linux系统下,通过发送kill –n 15 (pid)命令,观察SylixOS与Linux系统下的现象。

Linux下向进程发送kill 15信号后,现象如图 2.2 所示:

blob.png

图 2.2 Linux下kill 15现象


  SylixOS下向进程发送kill 15信号,现象如图 2.3 所示:

blob.png

图 2.3 SylixOS下kill 15现象

  可以发现Linux下进程收到kill 15信号后,主线程和子线程均退出,进程结束;SylixOS下收到kill 15信号后,主线程结束,子线程正常运行,直到子线程运行结束,进程结束。


3.原因分析

3.1 源码分析

  分析内核源码可以发现,当收到信号为SIGTERM,即kill 15信号时,系统不会将其设置为强制退出模式,所以主线程会结束并等待子线程退出。程序代码如程序清单 3.1 所示:

程序清单 3.1 设置退出模式

#define  SIGTERM                  15                  /*  进程中止                    */


#define LW_VPROC_EXIT_NORMAL      0                   /*  正常 (等待所有子线程退出)     */


#define LW_VPROC_EXIT_FORCE       1                   /*  强制退出 (杀死所有子线程)     */


if ((pid > 0) && (iSigNo != SIGTERM)) {

    vprocExitModeSet(pid, LW_VPROC_EXIT_FORCE);       /*  强制进程退出                 */

    

    vpr8ocSetImmediatelyTerm(pid);                    /*  立即退出模式                 */

}                                                   


3.2 修改方式

  结合内核源码,如果希得到与Linux相同的现象,可以在测试用例中添加使用对应的宏,但这种使用方式并不安全。修改方式如程序清单 3.2 所示:

程序清单 3.2 测试用例添加代码

#include <sys/vproc.h>


vprocExitModeSet(getpid(), LW_VPROC_EXIT_FORCE);     

  修改完成后,测试用例在SylixOS下编译运行后,发送kill 15信号现象如图 3.3 所示:

blob.png

图 3.3 修改后SylixOS下kill 15现象


  可以发现子线程与主线程均退出。


4.参考资料

  《RealEvo-IDE使用手册》

  《SylixOS应用开发手册》