SylixOS下kill 15信號問題分析
本文檔適用於希望了解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信號問題分析