bpo-41713: Remove PyOS_InitInterrupts() function (GH-23342)

Remove the undocumented PyOS_InitInterrupts() C function.

* Rename PyOS_InitInterrupts() to _PySignal_Init(). It now installs
  other signal handlers, not only SIGINT.
* Rename PyOS_FiniInterrupts() to _PySignal_Fini()
diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst
index 25b736e..ffc34d7 100644
--- a/Doc/whatsnew/3.10.rst
+++ b/Doc/whatsnew/3.10.rst
@@ -583,3 +583,8 @@
   ``Py_END_ALLOW_RECURSION`` and the ``recursion_critical`` field of the
   :c:type:`PyInterpreterState` structure.
   (Contributed by Serhiy Storchaka in :issue:`41936`.)
+
+* Removed the undocumented ``PyOS_InitInterrupts()`` function. Initializing
+  Python already implicitly installs signal handlers: see
+  :c:member:`PyConfig.install_signal_handlers`.
+  (Contributed by Victor Stinner in :issue:`41713`.)
diff --git a/Include/internal/pycore_pylifecycle.h b/Include/internal/pycore_pylifecycle.h
index e748112..b691e63 100644
--- a/Include/internal/pycore_pylifecycle.h
+++ b/Include/internal/pycore_pylifecycle.h
@@ -68,7 +68,8 @@
 extern void _PySlice_Fini(PyThreadState *tstate);
 extern void _PyAsyncGen_Fini(PyThreadState *tstate);
 
-extern void PyOS_FiniInterrupts(void);
+extern int _PySignal_Init(int install_signal_handlers);
+extern void _PySignal_Fini(void);
 
 extern void _PyExc_Fini(PyThreadState *tstate);
 extern void _PyImport_Fini(void);
diff --git a/Include/intrcheck.h b/Include/intrcheck.h
index 88f2a70..b8cc656 100644
--- a/Include/intrcheck.h
+++ b/Include/intrcheck.h
@@ -5,7 +5,6 @@
 #endif
 
 PyAPI_FUNC(int) PyOS_InterruptOccurred(void);
-PyAPI_FUNC(void) PyOS_InitInterrupts(void);
 #ifdef HAVE_FORK
 #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03070000
 PyAPI_FUNC(void) PyOS_BeforeFork(void);
diff --git a/Misc/NEWS.d/next/C API/2020-11-17-15-39-10.bpo-41713.Rq99Vc.rst b/Misc/NEWS.d/next/C API/2020-11-17-15-39-10.bpo-41713.Rq99Vc.rst
new file mode 100644
index 0000000..5373595
--- /dev/null
+++ b/Misc/NEWS.d/next/C API/2020-11-17-15-39-10.bpo-41713.Rq99Vc.rst
@@ -0,0 +1,3 @@
+Removed the undocumented ``PyOS_InitInterrupts()`` function. Initializing
+Python already implicitly installs signal handlers: see
+:c:member:`PyConfig.install_signal_handlers`. Patch by Victor Stinner.
diff --git a/Modules/signalmodule.c b/Modules/signalmodule.c
index 0ab3a71..c0b2117 100644
--- a/Modules/signalmodule.c
+++ b/Modules/signalmodule.c
@@ -1674,8 +1674,8 @@
 }
 
 
-static void
-finisignal(void)
+void
+_PySignal_Fini(void)
 {
     int i;
     PyObject *func;
@@ -1792,19 +1792,32 @@
     }
 }
 
-void
-PyOS_InitInterrupts(void)
+int
+_PySignal_Init(int install_signal_handlers)
 {
-    PyObject *m = PyImport_ImportModule("_signal");
-    if (m) {
-        Py_DECREF(m);
+    if (!install_signal_handlers) {
+        // Nothing to do
+        return 0;
     }
-}
 
-void
-PyOS_FiniInterrupts(void)
-{
-    finisignal();
+#ifdef SIGPIPE
+    PyOS_setsig(SIGPIPE, SIG_IGN);
+#endif
+#ifdef SIGXFZ
+    PyOS_setsig(SIGXFZ, SIG_IGN);
+#endif
+#ifdef SIGXFSZ
+    PyOS_setsig(SIGXFSZ, SIG_IGN);
+#endif
+
+    // Import _signal to install the Python SIGINT handler
+    PyObject *module = PyImport_ImportModule("_signal");
+    if (!module) {
+        return -1;
+    }
+    Py_DECREF(module);
+
+    return 0;
 }
 
 
diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c
index 33deafb..77a18e1 100644
--- a/Python/pylifecycle.c
+++ b/Python/pylifecycle.c
@@ -54,7 +54,6 @@
 static PyStatus init_import_site(void);
 static PyStatus init_set_builtins_open(void);
 static PyStatus init_sys_streams(PyThreadState *tstate);
-static PyStatus init_signals(PyThreadState *tstate);
 static void call_py_exitfuncs(PyThreadState *tstate);
 static void wait_for_thread_shutdown(PyThreadState *tstate);
 static void call_ll_exitfuncs(_PyRuntimeState *runtime);
@@ -1047,11 +1046,8 @@
     }
 
     if (is_main_interp) {
-        if (config->install_signal_handlers) {
-            status = init_signals(tstate);
-            if (_PyStatus_EXCEPTION(status)) {
-                return status;
-            }
+        if (_PySignal_Init(config->install_signal_handlers) < 0) {
+            return _PyStatus_ERR("can't initialize signals");
         }
 
         if (_PyTraceMalloc_Init(config->tracemalloc) < 0) {
@@ -1702,7 +1698,7 @@
     }
 
     /* Disable signal handling */
-    PyOS_FiniInterrupts();
+    _PySignal_Fini();
 
     /* Collect garbage.  This may call finalizers; it's nice to call these
      * before all modules are destroyed.
@@ -2730,25 +2726,6 @@
     exit(sts);
 }
 
-static PyStatus
-init_signals(PyThreadState *tstate)
-{
-#ifdef SIGPIPE
-    PyOS_setsig(SIGPIPE, SIG_IGN);
-#endif
-#ifdef SIGXFZ
-    PyOS_setsig(SIGXFZ, SIG_IGN);
-#endif
-#ifdef SIGXFSZ
-    PyOS_setsig(SIGXFSZ, SIG_IGN);
-#endif
-    PyOS_InitInterrupts(); /* May imply init_signals() */
-    if (_PyErr_Occurred(tstate)) {
-        return _PyStatus_ERR("can't import signal");
-    }
-    return _PyStatus_OK();
-}
-
 
 /* Restore signals that the interpreter has called SIG_IGN on to SIG_DFL.
  *