1.適用範圍安全
本文檔適用於但願瞭解SylixOS下kill 15信號的工程師。源碼分析
構建一個簡單的測試用例,主線程與子線程均運行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);
}
將測試用例編譯運行在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信號後,主線程結束,子線程正常運行,直到子線程運行結束,進程結束。
分析內核源碼能夠發現,當收到信號爲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); /* 當即退出模式 */
}
結合內核源碼,若是希獲得與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現象
能夠發現子線程與主線程均退出。
《RealEvo-IDE使用手冊》
《SylixOS應用開發手冊》