SylixOS下kill 15信号问题分析

1.适用范围安全

  本文档适用于但愿了解SylixOS下kill 15信号的工程师。源码分析

2.SylixOS与Linux的现象差别

2.1 构建测试用例

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

程序清单 2.1  构建测试用例spa

void *fun(void *arg)线程

{blog

    int n = 0;进程

    while(n < 20) {开发

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

        sleep(1);get

    }

    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应用开发手册》

相关文章
相关标签/搜索