File 0738-Add-support-for-SIGINFO-system-signal.patch of Package erlang
From 2dc1189382c940d97e3fce14e1b4773eff8b5cf1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jean-S=C3=A9bastien=20P=C3=A9dron?=
<jean-sebastien.pedron@dumbbell.fr>
Date: Tue, 1 Oct 2024 16:49:15 +0200
Subject: [PATCH 2/2] Add support for `SIGINFO` system signal
This signal is emitted when a user type Ctrl+T in a terminal. This is
only supported by few operating systems such as *BSD and OSX.
By default, the operating system displays on stdout the system process
PID, the system load and the duration the process is running. The signal
allows the application to display more details about its status and
progress.
---
erts/emulator/beam/atom.names | 1 +
erts/emulator/sys/unix/sys.c | 7 ++++
erts/emulator/test/os_signal_SUITE.erl | 45 +++++++++++++++++++++++++-
lib/kernel/doc/kernel_app.md | 4 +++
lib/kernel/src/os.erl | 2 +-
5 files changed, 57 insertions(+), 2 deletions(-)
diff --git a/erts/emulator/beam/atom.names b/erts/emulator/beam/atom.names
index 5686284187..ff5f2c1303 100644
--- a/erts/emulator/beam/atom.names
+++ b/erts/emulator/beam/atom.names
@@ -675,6 +675,7 @@ atom sigsegv
atom sigtstp
atom sigquit
atom sigwinch
+atom siginfo
atom silent
atom size
atom spawn_executable
diff --git a/erts/emulator/sys/unix/sys.c b/erts/emulator/sys/unix/sys.c
index 68479fa177..da034cb373 100644
--- a/erts/emulator/sys/unix/sys.c
+++ b/erts/emulator/sys/unix/sys.c
@@ -688,6 +688,7 @@ static RETSIGTYPE suspend_signal(int signum)
!SIGTTIN Stop Terminal input for background process
!SIGTTOU Stop Terminal output for background process
SIGWINCH Ign Window size change
+ SIGINFO Ign Status request from keyboard
*/
@@ -709,6 +710,9 @@ signalterm_to_signum(Eterm signal)
case am_sigstop: return SIGSTOP;
case am_sigtstp: return SIGTSTP;
case am_sigwinch: return SIGWINCH;
+#ifdef SIGINFO
+ case am_siginfo: return SIGINFO;
+#endif /* defined(SIGINFO) */
default: return 0;
}
}
@@ -731,6 +735,9 @@ signum_to_signalterm(int signum)
case SIGSTOP: return am_sigstop;
case SIGTSTP: return am_sigtstp; /* ^z */
case SIGWINCH: return am_sigwinch;
+#ifdef SIGINFO
+ case SIGINFO: return am_siginfo; /* ^t */
+#endif /* defined(SIGINFO) */
default: return am_error;
}
}
diff --git a/erts/emulator/test/os_signal_SUITE.erl b/erts/emulator/test/os_signal_SUITE.erl
index affcd95ef4..4887baf732 100644
--- a/erts/emulator/test/os_signal_SUITE.erl
+++ b/erts/emulator/test/os_signal_SUITE.erl
@@ -42,7 +42,8 @@
t_sigalrm/1,
t_sigchld/1,
t_sigchld_fork/1,
- t_sigwinch/1]).
+ t_sigwinch/1,
+ t_siginfo/1]).
-define(signal_server, erl_signal_server).
@@ -61,6 +62,7 @@ all() ->
t_sigchld,
t_sigchld_fork,
t_sigwinch,
+ t_siginfo,
set_unset]
end.
@@ -329,6 +331,47 @@ t_sigwinch(_Config) ->
os:set_signal(sigwinch, ignore),
ok.
+t_siginfo(_Config) ->
+ SiginfoSupported = try
+ os:set_signal(siginfo, default),
+ true
+ catch
+ error:badarg ->
+ false
+ end,
+ case SiginfoSupported of
+ true ->
+ Pid1 = setup_service(),
+ OsPid = os:getpid(),
+ os:set_signal(siginfo, handle),
+ ok = kill("INFO", OsPid),
+ ok = kill("INFO", OsPid),
+ ok = kill("INFO", OsPid),
+ Msgs1 = fetch_msgs(Pid1),
+ io:format("Msgs1: ~p~n", [Msgs1]),
+ [{notify,siginfo},
+ {notify,siginfo},
+ {notify,siginfo}] = Msgs1,
+ %% no proc
+ ok = kill("INFO", OsPid),
+ ok = kill("INFO", OsPid),
+ ok = kill("INFO", OsPid),
+ %% ignore
+ Pid2 = setup_service(),
+ os:set_signal(siginfo, ignore),
+ ok = kill("INFO", OsPid),
+ ok = kill("INFO", OsPid),
+ ok = kill("INFO", OsPid),
+ Msgs2 = fetch_msgs(Pid2),
+ io:format("Msgs2: ~p~n", [Msgs2]),
+ [] = Msgs2,
+ %% reset to ignore (it's the default)
+ os:set_signal(siginfo, ignore);
+ false ->
+ ok
+ end,
+ ok.
+
%% nif stubs
diff --git a/lib/kernel/doc/src/kernel_app.xml b/lib/kernel/doc/src/kernel_app.xml
index b19a35d126..186ce889e5 100644
--- a/lib/kernel/doc/src/kernel_app.xml
+++ b/lib/kernel/doc/src/kernel_app.xml
@@ -110,6 +110,11 @@
<item><p>Stop typed at terminal</p></item>
<tag><c>sigwinch</c></tag>
<item><p>Window size change</p></item>
+ <tag><c>siginfo</c></tag>
+ <item><p>Status request from keyboard.
+ Note several operating systems (Linux in particular) do not support this signal.
+ <c>os:set_signal/2</c> will thow a <c>badarg</c> exception if support is missing.
+ </p></item>
</taglist>
<p>Setting OS signals are described in <seemfa marker="os#set_signal/2"><c>os:set_signal/2</c></seemfa>.</p>
diff --git a/lib/kernel/src/os.erl b/lib/kernel/src/os.erl
index e730c085ad..bab043370d 100644
--- a/lib/kernel/src/os.erl
+++ b/lib/kernel/src/os.erl
@@ -302,7 +302,7 @@ Each signal my be set to one of the following options:
-spec set_signal(Signal, Option) -> 'ok' when
Signal :: 'sighup' | 'sigquit' | 'sigabrt' | 'sigalrm' |
'sigterm' | 'sigusr1' | 'sigusr2' | 'sigchld' |
- 'sigstop' | 'sigtstp' | 'sigwinch',
+ 'sigstop' | 'sigtstp' | 'sigwinch' | 'siginfo',
Option :: 'default' | 'handle' | 'ignore'.
set_signal(_Signal, _Option) ->
--
2.43.0