我用C编写了一个程序,需要处理ctrl + z
和相应的SIGTSTP和SIGCONT信号。
收到信号后,我的变量和进程会发生什么变化?
通过信号处理程序signal(SIGCONT, &sig_handler);
处理信号后,我的进程会发生什么情况?
最佳答案
有(至少)三种可能的情况:
进程当前正在用户空间中运行:
在这种情况下,进程被抢占(类似于多任务处理时其时间片用完时的方式),在恢复之前不考虑重新调度。
进程当前正在系统调用中等待:
通常系统调用被中断,在恢复之前不考虑进程的调度。当它被恢复时,一些系统调用返回-EINTR
并且必须重新启动。一些系统调用会自动重新启动。
进程是磁盘等待(状态D),例如等待缓冲区/页面:
信号被设置为挂起,但在操作完成之前不会传递。之后,与上述情形之一相同。
通常这一切对过程本身是相当透明的。
这与SIGTSTP
和SIGSTOP
的默认操作相同(但后者不能被捕获或忽略)。