c - 当程序接收到 SIGTSTP 信号时会发生什么

标签 c unix signals

我用 C 写了一个程序,我需要处理 ctrl + z 和相应的信号 SIGTSTP 和 SIGCONT。

接收到信号后我的变量和进程会发生什么变化?
通过信号处理程序 signal(SIGCONT, &sig_handler); 处理信号后,我的进程发生了什么?

最佳答案

有(至少)三种可能的情况:

  • 进程当前在用户空间中运行:

    在这种情况下,进程被抢占(类似于多任务处理时其时间片用完的方式)并且在恢复之前不会考虑重新安排。

  • 进程当前正在系统调用中等待:

    通常系统调用会被中断,进程不会被考虑调度,直到它被恢复。当它恢复时,一些系统调用返回 -EINTR 并且必须重新启动。一些系统调用会自动重新启动。

  • 进程正在等待磁盘(状态 D),例如等待缓冲区/页面输入:

    信号被设置为挂起,但在操作完成之前不会被传送。之后就和上面的一种情况一样。

通常这一切对流程本身来说都是透明的。

这与 SIGTSTPSIGSTOP 的默认操作相同(但是后者不能被捕获或忽略)。

关于c - 当程序接收到 SIGTSTP 信号时会发生什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34980777/

相关文章:

c - 为什么 execl 会覆盖文件

linux - 使用建议文件锁限制并发进程

linux - 回显到文件时错误重定向到输出流失败。为什么?

c++ - 为什么只能从信号处理程序安全地调用异步信号安全函数?

c - 信号 - 使用 CTRL-C 终止进程并使用 CTRL-Z 停止进程 + 测量时间

c - 进程共享条件变量 : how to recover after one process dies?

c - 移动指针后如何释放一些字节?

c - GTK C - 如何编辑关闭窗口按钮(右上角的 X 按钮)的功能?

python - 如何禁用控制字符的 shell 拦截?

c++ - 带有 lambda 表达式的 Boost::Signals2 插槽在 arm32 上使用 gcc6 失败