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

execvp调用后子进程无限挂起,手动执行正常,求问题排查

问题分析与解决

你提供的C++代码存在几处关键问题,导致cool进程看似无法终止,以下是具体分析和修复方案:

1. execvp语句缺少分号

代码中execvp调用末尾未添加分号,属于语法错误,会引发编译异常或运行时不可预期的行为:

execvp(const_cast<char*>("/bin/cool"), argument_list) // 此处缺少分号

修正后:

execvp(const_cast<char*>("/bin/cool"), argument_list);

2. execvp失败后未处理子进程退出

execvp仅在成功时会完全替换子进程的代码镜像,失败时会返回-1,此时子进程会继续执行后续代码(包括ALOGI("Done Executing StoreKeybox");),且未主动退出,导致父进程持续等待该子进程,看起来像是cool进程无法终止。

需在execvp调用后添加错误处理和退出逻辑:

if (execvp(const_cast<char*>("/bin/cool"), argument_list) == -1) {
    ALOGI("Failed to execute cool: %s", strerror(errno));
    exit(EXIT_FAILURE);
}

(注:需包含<cstring>头文件以使用strerror函数)

3. 父进程wait循环存在死循环风险

父进程的do-while循环未处理wait返回-1的情况(当没有子进程可等待时,wait返回-1并设置errno),会导致父进程陷入死循环。需增加返回值判断:

do {
    tpid = wait(&status);
    if (tpid == -1) {
        if (errno == ECHILD) {
            // 无剩余子进程,退出循环
            break;
        } else {
            ALOGI("wait error: %s", strerror(errno));
            break;
        }
    }
    if(tpid != pid) process_terminated(tpid);
} while(tpid != pid);

补充说明

手动执行/bin/cool /data/cool.bin能正常终止,说明cool程序本身无问题,故障完全源于你的C++代码对子进程的处理逻辑。修复上述问题后,子进程会正确启动cool程序,cool终止后父进程会正常回收子进程,不会再出现进程无法终止的现象。

内容的提问来源于stack exchange,提问作者FotisK

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 08:17:29