You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何恢复已停止的进程?我的测试代码为何无法正常恢复?

问题描述

测试停止并恢复进程的代码如下:

#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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 17:55:28