@@ -11,6 +11,10 @@ internal sealed class CTRLPlusCCancellationTokenSource : ITestApplicationCancell
11
11
private readonly CancellationTokenSource _cancellationTokenSource = new ( ) ;
12
12
private readonly ILogger ? _logger ;
13
13
14
+ #if NETCOREAPP
15
+ private PosixSignalRegistration ? _sigTermRegistration ;
16
+ #endif
17
+
14
18
public CTRLPlusCCancellationTokenSource ( IConsole ? console = null , ILogger ? logger = null )
15
19
{
16
20
if ( console is not null && ! IsCancelKeyPressNotSupported ( ) )
@@ -19,7 +23,38 @@ public CTRLPlusCCancellationTokenSource(IConsole? console = null, ILogger? logge
19
23
}
20
24
21
25
_logger = logger ;
26
+
27
+ #if NETCOREAPP
28
+ // Register for SIGTERM signals if not running on WASI
29
+ if ( ! OperatingSystem . IsWasi ( ) )
30
+ {
31
+ try
32
+ {
33
+ _sigTermRegistration = PosixSignalRegistration . Create ( PosixSignal . SIGTERM , HandlePosixSignal ) ;
34
+ }
35
+ catch ( Exception ex )
36
+ {
37
+ _logger ? . LogWarning ( $ "Failed to register SIGTERM signal handler: { ex } ") ;
38
+ }
39
+ }
40
+ #endif
41
+ }
42
+
43
+ #if NETCOREAPP
44
+ private void HandlePosixSignal ( PosixSignalContext context )
45
+ {
46
+ context . Cancel = true ;
47
+ try
48
+ {
49
+ _cancellationTokenSource . Cancel ( ) ;
50
+ _logger ? . LogInformation ( "Received SIGTERM signal, cancellation requested." ) ;
51
+ }
52
+ catch ( AggregateException ex )
53
+ {
54
+ _logger ? . LogWarning ( $ "Exception during SIGTERM signal handling:\n { ex } ") ;
55
+ }
22
56
}
57
+ #endif
23
58
24
59
[ SupportedOSPlatformGuard ( "android" ) ]
25
60
[ SupportedOSPlatformGuard ( "ios" ) ]
@@ -51,7 +86,12 @@ private void OnConsoleCancelKeyPressed(object? sender, ConsoleCancelEventArgs e)
51
86
}
52
87
53
88
public void Dispose ( )
54
- => _cancellationTokenSource . Dispose ( ) ;
89
+ {
90
+ #if NETCOREAPP
91
+ _sigTermRegistration ? . Dispose ( ) ;
92
+ #endif
93
+ _cancellationTokenSource . Dispose ( ) ;
94
+ }
55
95
56
96
public void Cancel ( )
57
97
=> _cancellationTokenSource . Cancel ( ) ;
0 commit comments