【发布时间】:2016-01-24 20:02:12
【问题描述】:
我用C写了一个程序,我需要处理ctrl + z和对应的信号SIGTSTP和SIGCONT。
收到信号后我的变量和进程会发生什么?
通过信号处理器signal(SIGCONT, &sig_handler);处理信号后,我的进程会发生什么?
【问题讨论】:
-
操作系统/内核处理所有这些。它保存并恢复正在运行的进程的状态。
我用C写了一个程序,我需要处理ctrl + z和对应的信号SIGTSTP和SIGCONT。
收到信号后我的变量和进程会发生什么?
通过信号处理器signal(SIGCONT, &sig_handler);处理信号后,我的进程会发生什么?
【问题讨论】:
有(至少)三种可能的情况:
进程当前正在用户空间中运行:
在这种情况下,进程被抢占(类似于多任务处理时时间片用完时的方式)并且在恢复之前不会考虑重新调度。
进程当前正在等待系统调用:
通常系统调用被中断并且进程在恢复之前不会被考虑调度。当它恢复时,一些系统调用返回-EINTR 并且必须重新启动。一些系统调用会自动重新启动。
进程正在等待磁盘(状态 D),例如等待缓冲区/分页:
信号被设置为挂起,但直到操作完成才被传递。之后就和上面的一种情况一样。
通常这一切对流程本身来说都是相当透明的。
SIGTSTP 和 SIGSTOP 的默认操作也是如此(但是后者不能被捕获或忽略)。
【讨论】: