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
相关产品推荐
相关产品推荐

