SylixOS下kill 15信號問題分析

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應用開發手冊》


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章