diff --git a/mindspore/ccsrc/cxx_api/model/model_converter_utils/multi_process.cc b/mindspore/ccsrc/cxx_api/model/model_converter_utils/multi_process.cc index c56ef354d0..0ab8336b62 100644 --- a/mindspore/ccsrc/cxx_api/model/model_converter_utils/multi_process.cc +++ b/mindspore/ccsrc/cxx_api/model/model_converter_utils/multi_process.cc @@ -66,13 +66,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;