|
|
|
@ -65,13 +65,30 @@ Status MultiProcess::MainProcess(ProcessFuncCall parent_process, ProcessFuncCall
|
|
|
|
|
if (pid == 0) {
|
|
|
|
|
ChildProcess(child_process);
|
|
|
|
|
shared_memory.Detach();
|
|
|
|
|
MS_LOG_INFO << "Model converter: child process exit";
|
|
|
|
|
exit(0);
|
|
|
|
|
MS_LOG_INFO << "Model converter: child process sleep waiting for exit signal.";
|
|
|
|
|
while (1) {
|
|
|
|
|
// waiting for signal
|
|
|
|
|
}
|
|
|
|
|
} else { // parent process
|
|
|
|
|
ret = ParentProcess(parent_process);
|
|
|
|
|
shared_memory.Detach();
|
|
|
|
|
int status;
|
|
|
|
|
wait(&status);
|
|
|
|
|
|
|
|
|
|
MS_LOG_INFO << "Model converter: parent process kills child of fork.";
|
|
|
|
|
(void)kill(pid, SIGKILL);
|
|
|
|
|
constexpr uint32_t kMaxLoopCount = 5;
|
|
|
|
|
bool child_exited = false;
|
|
|
|
|
for (uint32_t i = 0; i < kMaxLoopCount; ++i) {
|
|
|
|
|
int status;
|
|
|
|
|
if (waitpid(pid, &status, WNOHANG) == pid) {
|
|
|
|
|
MS_LOG(INFO) << "Child process " << pid << " exits success.";
|
|
|
|
|
child_exited = true;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
sleep(1);
|
|
|
|
|
}
|
|
|
|
|
if (!child_exited) {
|
|
|
|
|
MS_LOG(WARNING) << "Child process " << pid << " has been killed but waitpid failed.";
|
|
|
|
|
}
|
|
|
|
|
shared_memory.Destroy();
|
|
|
|
|
}
|
|
|
|
|
return ret;
|
|
|
|
|