如何恢复已停止的进程?我的测试代码为何无法正常恢复?
问题描述
测试停止并恢复进程的代码如下:
#include <iostream> #include <csignal> #include <unistd.h> int main() { std::cout << "Hello" << std::endl; int pid = getpid(); kill(pid, SIGSTOP); kill(pid, SIGCONT); std::cout << "Bye" << std::endl; return 0; }
运行后仅输出:
Hello
进程停止后无法恢复,如何修复?
问题原因
SIGSTOP是强制暂停进程的信号,无法被捕获、忽略或阻塞,进程收到该信号后会立即进入暂停状态,后续代码(包括发送SIGCONT的语句)根本没有机会执行,自然无法触发进程恢复。
修复方案
要实现“暂停后恢复”的逻辑,需要借助另一个进程来发送恢复信号,最直接的方式是通过fork()创建子进程,由父进程负责发送控制信号:
#include <iostream> #include <csignal> #include <unistd.h> #include <sys/wait.h> int main() { pid_t pid = fork(); if (pid == 0) { // 子进程逻辑 std::cout << "子进程启动,PID: " << getpid() << std::endl; while (true) { // 循环输出以展示进程状态变化 std::cout << "子进程运行中..." << std::endl; sleep(1); } } else if (pid > 0) { // 父进程逻辑:控制子进程 sleep(2); // 等待子进程运行一会儿 std::cout << "父进程发送SIGSTOP,暂停子进程" << std::endl; kill(pid, SIGSTOP); sleep(3); // 让子进程暂停3秒 std::cout << "父进程发送SIGCONT,恢复子进程" << std::endl; kill(pid, SIGCONT); sleep(3); // 等待子进程再运行一会儿 kill(pid, SIGTERM); // 终止子进程 wait(nullptr); // 等待子进程退出 std::cout << "子进程已终止" << std::endl; } else { std::cerr << "fork失败" << std::endl; return 1; } return 0; }
代码说明
- 子进程启动后进入循环输出,直观展示运行状态;
- 父进程先等待子进程运行2秒,发送
SIGSTOP让子进程暂停; - 3秒后发送
SIGCONT恢复子进程; - 最后发送
SIGTERM终止子进程并等待其退出。
这样就能完整实现“暂停-恢复”的流程,因为发送恢复信号的操作由独立的父进程执行,不受子进程暂停状态的影响。
内容的提问来源于stack exchange,提问作者plpm
相关产品推荐
相关产品推荐

