前提
NovaShell主线版本中exec命令未禁用终端raw模式会导致进程无法接收信号,此处手动修改NovaShell代码,在exec前禁用raw模式
问题发现
禁用raw模式后,使用测试程序测试是否能正常接收SIGINT
信号,代码如下:
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <stdlib.h>
// 信号处理函数
void handle_signal(int signal)
{
if (signal == SIGINT)
{
printf("Caught SIGINT (Ctrl+C). Exiting gracefully...\n");
// 你可以在这里执行清理操作
exit(0); // 终止程序
}
}
int main()
{
// 注册信号处理函数
signal(SIGINT, handle_signal);
printf("program pid: %d.\n", getpid());
// 模拟一个长时间运行的进程
while (1)
{
printf("Running... Press Ctrl+C to stop.\n");
sleep(5);
}
return 0;
}
发现依旧无法终止进程
调试过程
在内核的ProcessManager::exit()
方法中打印日志输出被终止进程的pid:
在NovaShell中打印shell进程的pid:
在测试程序中打印pid:
运行结果如下:
shell pid: 6
program pid: 7
pid to exit: 0
pid对比后发现都不符合,因此猜测:SIGINT信号没有正确地传到进程中,导致ctrl+c无法终止进程
根据日志中的
Pid(0)
猜测信号传递到init程序DragonReach中?@longjin @GnoCiYeH