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应用开发手册》
转载于:https://blog.51cto.com/13549832/2073467