-
Notifications
You must be signed in to change notification settings - Fork 10.8k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[flang] use setsid to assign the child to prevent zombie as it will be clean up by init process #77944
Conversation
…up by init process
@llvm/pr-subscribers-flang-runtime Author: Yi Wu (yi-wu-arm) ChangesWhen using However, killing the parent does not automatically kill the child; the child will continue running until it exits. Full diff: https://github.com/llvm/llvm-project/pull/77944.diff 1 Files Affected:
diff --git a/flang/runtime/execute.cpp b/flang/runtime/execute.cpp
index 48773ae8114b0b..1bd5bb81ec8461 100644
--- a/flang/runtime/execute.cpp
+++ b/flang/runtime/execute.cpp
@@ -180,8 +180,6 @@ void RTNAME(ExecuteCommandLine)(const Descriptor &command, bool wait,
}
FreeMemory((void *)wcmd);
#else
- // terminated children do not become zombies
- signal(SIGCHLD, SIG_IGN);
pid_t pid{fork()};
if (pid < 0) {
if (!cmdstat) {
@@ -191,6 +189,18 @@ void RTNAME(ExecuteCommandLine)(const Descriptor &command, bool wait,
CheckAndCopyCharsToDescriptor(cmdmsg, "Fork failed");
}
} else if (pid == 0) {
+ if (setsid() == -1) {
+ if (!cmdstat) {
+ terminator.Crash(
+ "setsid() failed with errno: %d, asynchronous process initiation failed.",
+ errno);
+ } else {
+ StoreIntToDescriptor(cmdstat, ASYNC_NO_SUPPORT_ERR, terminator);
+ CheckAndCopyCharsToDescriptor(
+ cmdmsg, "setsid() failed, asynchronous process initiation failed.");
+ }
+ exit(EXIT_FAILURE);
+ }
int status{std::system(newCmd)};
TerminationCheck(status, cmdstat, cmdmsg, terminator);
exit(status);
|
✅ With the latest revision this PR passed the C/C++ code formatter. |
debug printout
A different session id is what we want. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM but give a bit of time for anyone else to have a look in case my understanding (which matches yours) is wrong.
if (!cmdstat) { | ||
terminator.Crash("setsid() failed with errno: %d, asynchronous " | ||
"process initiation failed.", | ||
errno); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I guess this formatting comes from clang-format, I wonder why it does such a bad job here. (This isn't a request for you to change anything just a comment)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What's the purpose of this change? Is there a test that's failing?
Also, I don't see the changes listed here, but when I try to build from this repository, I get errors. The function ExecuteCommandLine
declares a variable called newCmd
. The version of that declaration that I see in this repository looks like this:
const char *newCmd{EnsureNullTerminated(
...
Then, later in this function this variable is deallocated. For me, this causes the following error message:
/local/home/psteinfeld/main/yiwu/llvm-project/flang/runtime/execute.cpp:213:24: error: cast from type ‘const char*’ to type ‘void*’ casts away qualifiers [-Werror=cast-qual]
213 | FreeMemory((void *)newCmd);
| ^~~~~~
At global scope:
cc1plus: error: unrecognized command line option ‘-Wno-ctad-maybe-unsupported’ [-Werror]
cc1plus: all warnings being treated as errors
Sorry, let me rebase on main, there are patches has been uploaded to solve this problem. The problem is listed here: #77803 In short, once a async A simple reproducer would be program test()
call execute_command_line("echo hi", .false.)
call execute_command_line("echo hi")
end program test console output
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
All builds and tests correctly and looks good.
Could you add a test? |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LG.
When using
setsid()
in a child process created byfork()
, a new session is created, and the child becomes a session leader. If the parent process terminates before the child, the child becomes an orphan and is adopted by theinit
process. Theinit
process will eventually clean up the child process once it exits.However, killing the parent does not automatically kill the child; the child will continue running until it exits.
Proper cleanup involves waiting for the child process to exit using
wait()
orwaitpid()
in the parent process to avoid zombie processes, but this approach is not valid forEXECUTE_COMMAND_LINE
with async mode.