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

相關文章
相關標籤/搜索