Skip to content

Add Linux and Android support for ProcessStartInfo.KillOnParentExit using prctl(PR_SET_PDEATHSIG)#127112

Merged
adamsitnik merged 17 commits intomainfrom
copilot/extend-kill-on-parent-exit-linux
May 4, 2026
Merged

Add Linux and Android support for ProcessStartInfo.KillOnParentExit using prctl(PR_SET_PDEATHSIG)#127112
adamsitnik merged 17 commits intomainfrom
copilot/extend-kill-on-parent-exit-linux

Conversation

Copy link
Copy Markdown
Contributor

Copilot AI commented Apr 18, 2026

Description

Adds Linux and Android support for ProcessStartInfo.KillOnParentExit using prctl(PR_SET_PDEATHSIG). Since PR_SET_PDEATHSIG fires when the calling thread exits (not the process), a dedicated long-lived thread is used to perform fork+exec so the signal is only delivered when the process exits.

Key design decisions

  • Dedicated thread: EnsurePDeathSigThread lazily starts a detached thread that lives for the process lifetime. The thread-start check uses a plain bool protected by the mutex (no atomics needed since the check is always done under the mutex).
  • Mutex/condvar synchronization: Callers submit a PDeathSigForkRequest struct to the dedicated thread via a shared pointer, protected by a mutex. Callers wait for s_pdeathsig_request == NULL before submitting to prevent overwriting a pending request, and each request has a per-request done flag to avoid lost-wakeup issues.
  • Orphan detection: After prctl(PR_SET_PDEATHSIG) in the child, a getppid() check detects if the parent died between fork and prctl, since PR_SET_PDEATHSIG will not deliver the signal in that case.
  • KillOnParentExit passed unconditionally: The managed code passes KillOnParentExit to the native shim unconditionally; the native side handles unsupported platforms as a no-op via HAVE_PR_SET_PDEATHSIG.
  • Android support: PR_SET_PDEATHSIG is available on Android, so [SupportedOSPlatform("android")] is added alongside [SupportedOSPlatform("linux")].

Copilot AI and others added 2 commits April 18, 2026 21:45
…R_SET_PDEATHSIG)

Implements PR_SET_PDEATHSIG-based KillOnParentExit on Linux using a dedicated
long-lived thread to ensure the death signal fires on process exit, not thread exit.

Changes:
- Add HAVE_PR_SET_PDEATHSIG cmake check and config
- Add killOnParentExit parameter to SystemNative_ForkAndExecProcess
- Implement dedicated pdeathsig thread with mutex/condvar synchronization
- Call prctl(PR_SET_PDEATHSIG, SIGKILL) in child after fork
- Pass KillOnParentExit through managed interop layer
- Add [SupportedOSPlatform("linux")] to ref and impl
- Enable KillOnParentExitTests on Linux

Agent-Logs-Url: https://github.com/dotnet/runtime/sessions/85b53068-8457-4ee3-bdbf-4339fc5a007e

Co-authored-by: adamsitnik <6011991+adamsitnik@users.noreply.github.com>
…necessary prctl in thread, improve getppid comment

Agent-Logs-Url: https://github.com/dotnet/runtime/sessions/85b53068-8457-4ee3-bdbf-4339fc5a007e

Co-authored-by: adamsitnik <6011991+adamsitnik@users.noreply.github.com>
@adamsitnik
Copy link
Copy Markdown
Member

adamsitnik commented Apr 19, 2026

@copilot fix following build failure:


FAILED: libs-native/System.Native/CMakeFiles/System.Native-Static.dir/pal_process.c.o 
  /usr/bin/gcc-15 -DBUILDENV_CHECKED=1 -DDEBUG -DDISABLE_CONTRACTS -DHAS_CONSOLE_SIGNALS -DHOST_64BIT -DHOST_AMD64 -DHOST_UNIX -DPALEXPORT=EXTERN_C -DTARGET_64BIT -DTARGET_AMD64 -DTARGET_LINUX -DTARGET_UNIX -DURTBLDENV_FRIENDLY=Checked -D_DBG -D_DEBUG -D_FILE_OFFSET_BITS=64 -D_TIME_BITS=64 -I/__w/1/s/artifacts/obj/coreclr/linux.x64.Checked/libs-native/System.Native -I/__w/1/s/src/native/libs/System.Native -I/__w/1/s/src/native -I/__w/1/s/src/native/inc -std=gnu99 -Wno-declaration-after-statement -D_GNU_SOURCE -std=gnu11 -fPIC -O2 -Wall -g -fno-omit-frame-pointer -fno-strict-overflow -fno-strict-aliasing -fstack-protector-strong -Werror -Wno-unused-variable -Wno-unused-value -Wno-unused-function -Wno-tautological-compare -Wno-unknown-pragmas -Wimplicit-fallthrough -Wno-unused-but-set-variable -ffp-contract=off -Wno-uninitialized -Wno-strict-aliasing -Wno-array-bounds -Wno-stringop-truncation -fsigned-char -fvisibility=hidden -ffunction-sections -I/__w/1/s/src/native/libs/Common -I/__w/1/s/artifacts/obj/coreclr/linux.x64.Checked/libs-native/Common -MD -MT libs-native/System.Native/CMakeFiles/System.Native-Static.dir/pal_process.c.o -MF libs-native/System.Native/CMakeFiles/System.Native-Static.dir/pal_process.c.o.d -o libs-native/System.Native/CMakeFiles/System.Native-Static.dir/pal_process.c.o -c /__w/1/s/src/native/libs/System.Native/pal_process.c
  /__w/1/s/src/native/libs/System.Native/pal_process.c: In function ‘PDeathSigThreadFunc’:
  /__w/1/s/src/native/libs/System.Native/pal_process.c:411:1: error: no return statement in function returning non-void [-Werror=return-type]
    411 | }
        | ^
  cc1: all warnings being treated as errors

Add return NULL after infinite while(1) loop to satisfy GCC's
-Werror=return-type, with clang pragma to suppress -Wunreachable-code-return.

Agent-Logs-Url: https://github.com/dotnet/runtime/sessions/2659e9ab-8d2c-48d8-a7af-d5356d056e46

Co-authored-by: adamsitnik <6011991+adamsitnik@users.noreply.github.com>
Copilot AI requested review from Copilot and removed request for Copilot April 19, 2026 11:03
Copy link
Copy Markdown
Contributor Author

Copilot AI commented Apr 19, 2026

@copilot fix following build failure:

'''log...

Fixed in dc2712a. Added return NULL; after the infinite while(1) loop to satisfy GCC's -Werror=return-type, with a clang pragma to suppress -Wunreachable-code-return (which was the original reason the return was removed).

Copy link
Copy Markdown
Member

@adamsitnik adamsitnik left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@copilot fix the WASM build

  FAILED: libs-native/System.Native/CMakeFiles/System.Native-Static.dir/pal_process.c.o 
  /__w/1/s/src/mono/browser/emsdk/emscripten/emcc -DCOMPILER_SUPPORTS_W_RESERVED_IDENTIFIER -DDISABLE_CONTRACTS -DGEN_PINVOKE=1 -DHOST_32BIT=1 -DHOST_BROWSER -DHOST_UNIX -DHOST_WASM -DNDEBUG -DTARGET_32BIT -DTARGET_BROWSER -DTARGET_UNIX -DTARGET_WASM -DTARGET_WASM32 -DURTBLDENV_FRIENDLY=Retail -D_FILE_OFFSET_BITS=64 -D_TIME_BITS=64 -I/__w/1/s/artifacts/obj/coreclr/browser.wasm.Release/libs-native/System.Native -I/__w/1/s/src/native/libs/System.Native -I/__w/1/s/src/native -I/__w/1/s/src/native/inc -std=gnu99 -Wno-declaration-after-statement -Wno-pre-c11-compat -O3 -DNDEBUG -std=gnu11 -fwasm-exceptions -mbulk-memory -msimd128 -O3 -Wall -Wno-null-conversion -glldb -Wno-unused-parameter -Wno-alloca -Wno-implicit-int-float-conversion -fno-omit-frame-pointer -fno-strict-overflow -fno-strict-aliasing -Werror -Wno-unused-variable -Wno-unused-value -Wno-unused-function -Wno-tautological-compare -Wno-unknown-pragmas -Wimplicit-fallthrough -Wno-unused-but-set-variable -ffp-contract=off -Wno-unknown-warning-option -ferror-limit=4096 -Wno-unused-private-field -Wno-constant-logical-operand -Wno-pragma-pack -Wno-incompatible-ms-struct -Wno-reserved-identifier -Wno-unsafe-buffer-usage -Wno-single-bit-bitfield-constant-conversion -Wno-cast-function-type-strict -Wno-switch-default -fsigned-char -fvisibility=hidden -ffunction-sections -I/__w/1/s/src/native/libs/Common -I/__w/1/s/artifacts/obj/coreclr/browser.wasm.Release/libs-native/Common -Oz -Weverything -Wno-format-nonliteral -Wno-disabled-macro-expansion -Wno-padded -Wno-empty-translation-unit -Wno-cast-align -Wno-typedef-redefinition -Wno-thread-safety-analysis -Wno-c11-extensions -Wno-pre-c11-compat -MD -MT libs-native/System.Native/CMakeFiles/System.Native-Static.dir/pal_process.c.o -MF libs-native/System.Native/CMakeFiles/System.Native-Static.dir/pal_process.c.o.d -o libs-native/System.Native/CMakeFiles/System.Native-Static.dir/pal_process.c.o -c /__w/1/s/src/native/libs/System.Native/pal_process.c
  /__w/1/s/src/native/libs/System.Native/pal_process.c:537:12: error: call to undeclared function 'ForkAndExecProcessInternal'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
    537 |     return ForkAndExecProcessInternal(
        |            ^
  /__w/1/s/src/native/libs/System.Native/pal_process.c:544:16: error: static declaration of 'ForkAndExecProcessInternal' follows non-static declaration
    544 | static int32_t ForkAndExecProcessInternal(
        |                ^
  /__w/1/s/src/native/libs/System.Native/pal_process.c:537:12: note: previous implicit declaration is here
    537 |     return ForkAndExecProcessInternal(
        |            ^
  2 errors generated.

Comment thread src/native/libs/System.Native/pal_process.c Outdated
Move ForkAndExecProcessInternal forward declaration outside #if
HAVE_PR_SET_PDEATHSIG so it's visible on all platforms (fixes WASM build).
Simplify return NULL in PDeathSigThreadFunc by removing pragma guards.

Agent-Logs-Url: https://github.com/dotnet/runtime/sessions/0261d155-fd8a-43c3-80bc-9085dec73b97

Co-authored-by: adamsitnik <6011991+adamsitnik@users.noreply.github.com>
Copilot AI requested review from Copilot and removed request for Copilot April 19, 2026 11:44
Copy link
Copy Markdown
Contributor Author

Copilot AI commented Apr 19, 2026

@copilot fix the WASM build

'''log...

Fixed in 3723cc4. The ForkAndExecProcessInternal forward declaration was inside the #if HAVE_PR_SET_PDEATHSIG block, so on WASM (where it's 0) it wasn't visible. Moved the forward declaration before the #if block so it's always available.

Copilot AI requested a review from adamsitnik April 19, 2026 11:45
@adamsitnik adamsitnik requested review from Copilot and removed request for adamsitnik April 19, 2026 11:52
…ndroid support

Agent-Logs-Url: https://github.com/dotnet/runtime/sessions/7d461b6e-4e3b-451c-b496-397402d75d53

Co-authored-by: adamsitnik <6011991+adamsitnik@users.noreply.github.com>
Copilot AI requested review from Copilot and removed request for Copilot May 3, 2026 20:08
Copilot AI changed the title Add Linux support for ProcessStartInfo.KillOnParentExit using prctl(PR_SET_PDEATHSIG) Add Linux and Android support for ProcessStartInfo.KillOnParentExit using prctl(PR_SET_PDEATHSIG) May 3, 2026
Copilot AI requested a review from adamsitnik May 3, 2026 20:09
@adamsitnik
Copy link
Copy Markdown
Member

/azp run runtime-android runtime-androidemulator

@azure-pipelines
Copy link
Copy Markdown

No pipelines are associated with this pull request.

@adamsitnik
Copy link
Copy Markdown
Member

/azp run runtime-android

@azure-pipelines
Copy link
Copy Markdown

Azure Pipelines successfully started running 1 pipeline(s).

@adamsitnik adamsitnik requested a review from jkotas May 3, 2026 22:14
Copy link
Copy Markdown
Member

@adamsitnik adamsitnik left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, we just need to update one XML doc sentence

Co-authored-by: Adam Sitnik <adam.sitnik@gmail.com>
Copilot AI review requested due to automatic review settings May 4, 2026 07:23
@adamsitnik adamsitnik enabled auto-merge (squash) May 4, 2026 07:25
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 11 out of 11 changed files in this pull request and generated 2 comments.

Comment thread src/native/libs/System.Native/pal_process.c
Comment thread src/native/libs/System.Native/pal_process.c Outdated
Comment thread src/native/libs/System.Native/pal_process.c Outdated
Copy link
Copy Markdown
Member

@tmds tmds left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lgtm, I left some suggestions.

… call under mutex; update orphan-check comment

Agent-Logs-Url: https://github.com/dotnet/runtime/sessions/4461470f-ca8e-45c7-b43a-5462587db7d2

Co-authored-by: adamsitnik <6011991+adamsitnik@users.noreply.github.com>
Comment thread src/native/libs/System.Native/pal_process.c Outdated
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area-System.Diagnostics.Process os-linux Linux OS (any supported distro)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants