1. 程式人生 > >SylixOS下kill 15信號問題分析

SylixOS下kill 15信號問題分析

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 所示:

技術分享圖片

圖 2.2 Linux下kill 15現象


SylixOS下向進程發送kill 15信號,現象如圖 2.3 所示:

技術分享圖片

圖 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 所示:

技術分享圖片

圖 3.3 修改後SylixOS下kill 15現象


可以發現子線程與主線程均退出。

4. 參考資料

《RealEvo-IDE使用手冊》

《SylixOS應用開發手冊》


SylixOS下kill 15信號問題分析