This is an automated email from the ASF dual-hosted git repository.

ligd pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx-apps.git


The following commit(s) were added to refs/heads/master by this push:
     new 60d814efa sched/signal: Add support to disable partial or all signals
60d814efa is described below

commit 60d814efa2534630aa9d9b3a0c9454985845e40d
Author: wangchengdong <[email protected]>
AuthorDate: Wed Jan 14 23:23:03 2026 +0800

    sched/signal: Add support to disable partial or all signals
    
      Fix dependency issue when signals are partially or fully enabled
    
    Co-authored-by: guoshichao <[email protected]>
    Signed-off-by: Chengdong Wang <[email protected]>
---
 examples/buttons/buttons_main.c   |  2 ++
 examples/chrono/chrono_main.c     |  2 ++
 netutils/dhcpc/dhcpc.c            | 16 ++++++++++++++++
 netutils/dhcpd/dhcpd.c            |  7 ++++++-
 netutils/ping/icmp_ping.c         |  4 ++++
 netutils/telnetd/telnetd_daemon.c |  6 +++---
 nshlib/nsh_builtin.c              | 23 +++++++++++++++++------
 nshlib/nsh_proccmds.c             |  6 ++++++
 system/cu/cu_main.c               |  8 ++++++--
 testing/ostest/ostest_main.c      | 34 ++++++++++++++++++++--------------
 10 files changed, 82 insertions(+), 26 deletions(-)

diff --git a/examples/buttons/buttons_main.c b/examples/buttons/buttons_main.c
index d4b36431c..13d4b080a 100644
--- a/examples/buttons/buttons_main.c
+++ b/examples/buttons/buttons_main.c
@@ -219,9 +219,11 @@ static int button_daemon(int argc, char *argv[])
       goto errout_with_fd;
     }
 
+#ifdef CONFIG_ENABLE_ALL_SIGNALS
   /* Ignore the default signal action */
 
   signal(CONFIG_EXAMPLES_BUTTONS_SIGNO, SIG_IGN);
+#endif /* CONFIG_ENABLE_ALL_SIGNALS */
 #endif
 
   /* Now loop forever, waiting BUTTONs events */
diff --git a/examples/chrono/chrono_main.c b/examples/chrono/chrono_main.c
index ee6658591..9ce5dbb58 100644
--- a/examples/chrono/chrono_main.c
+++ b/examples/chrono/chrono_main.c
@@ -165,9 +165,11 @@ static int chrono_daemon(int argc, char *argv[])
       goto errout_with_fd;
     }
 
+#ifdef CONFIG_ENABLE_ALL_SIGNALS
   /* Ignore the default signal action */
 
   signal(BUTTON_SIGNO, SIG_IGN);
+#endif
 
   /* Now loop forever, waiting BUTTONs events */
 
diff --git a/netutils/dhcpc/dhcpc.c b/netutils/dhcpc/dhcpc.c
index dc6b46230..003d7d8cb 100644
--- a/netutils/dhcpc/dhcpc.c
+++ b/netutils/dhcpc/dhcpc.c
@@ -533,8 +533,16 @@ static void *dhcpc_run(void *args)
   struct dhcpc_state result;
   int ret;
 
+#ifndef CONFIG_ENABLE_ALL_SIGNALS
+  pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
+  pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, NULL);
+#endif
+
   while (1)
     {
+#ifndef CONFIG_ENABLE_ALL_SIGNALS
+      pthread_testcancel();
+#endif
       ret = dhcpc_request(pdhcpc, &result);
       if (ret == OK)
         {
@@ -701,7 +709,9 @@ void dhcpc_close(FAR void *handle)
 void dhcpc_cancel(FAR void *handle)
 {
   struct dhcpc_state_s *pdhcpc = (struct dhcpc_state_s *)handle;
+#ifdef CONFIG_ENABLE_ALL_SIGNALS
   sighandler_t old;
+#endif
   int ret;
 
   if (pdhcpc)
@@ -710,6 +720,7 @@ void dhcpc_cancel(FAR void *handle)
 
       if (pdhcpc->thread)
         {
+#ifdef CONFIG_ENABLE_ALL_SIGNALS
           old = signal(SIGQUIT, SIG_IGN);
 
           /* Signal the dhcpc_run */
@@ -719,6 +730,9 @@ void dhcpc_cancel(FAR void *handle)
             {
               nerr("ERROR: pthread_kill DHCPC thread\n");
             }
+#else
+          pthread_cancel(pdhcpc->thread);
+#endif
 
           /* Wait for the end of dhcpc_run */
 
@@ -729,7 +743,9 @@ void dhcpc_cancel(FAR void *handle)
             }
 
           pdhcpc->thread = 0;
+#ifdef CONFIG_ENABLE_ALL_SIGNALS
           signal(SIGQUIT, old);
+#endif
         }
     }
 }
diff --git a/netutils/dhcpd/dhcpd.c b/netutils/dhcpd/dhcpd.c
index 558991c22..a382709a2 100644
--- a/netutils/dhcpd/dhcpd.c
+++ b/netutils/dhcpd/dhcpd.c
@@ -1555,6 +1555,7 @@ static pid_t dhcpd_get_pid(void)
  *
  ****************************************************************************/
 
+#ifdef CONFIG_ENABLE_ALL_SIGNALS
 static void
 dhcpd_signal_handler(int signo, FAR siginfo_t *info, FAR void *ctx)
 {
@@ -1562,6 +1563,7 @@ dhcpd_signal_handler(int signo, FAR siginfo_t *info, FAR 
void *ctx)
 
   g_dhcpd_daemon.ds_state = DHCPD_STOP_REQUESTED;
 }
+#endif
 
 /****************************************************************************
  * Public Functions
@@ -1573,7 +1575,9 @@ dhcpd_signal_handler(int signo, FAR siginfo_t *info, FAR 
void *ctx)
 
 int dhcpd_run(FAR const char *interface)
 {
+#ifdef CONFIG_ENABLE_ALL_SIGNALS
   struct sigaction act;
+#endif
   int sockfd = -1;
   int nbytes;
 
@@ -1602,11 +1606,12 @@ int dhcpd_run(FAR const char *interface)
 
   /* Install signal handler for CONFIG_NETUTILS_DHCPD_SIGWAKEUP */
 
+#ifdef CONFIG_ENABLE_ALL_SIGNALS
   memset(&act, 0, sizeof(act));
   act.sa_sigaction = dhcpd_signal_handler;
   act.sa_flags = SA_SIGINFO;
   sigaction(CONFIG_NETUTILS_DHCPD_SIGWAKEUP, &act, NULL);
-
+#endif
   /* Indicate that we have started */
 
   g_dhcpd_daemon.ds_state = DHCPD_RUNNING;
diff --git a/netutils/ping/icmp_ping.c b/netutils/ping/icmp_ping.c
index 7aa1d3973..55db84854 100644
--- a/netutils/ping/icmp_ping.c
+++ b/netutils/ping/icmp_ping.c
@@ -91,6 +91,7 @@ static volatile bool g_exiting;
  * Private Functions
  ****************************************************************************/
 
+#ifdef CONFIG_ENABLE_ALL_SIGNALS
 /****************************************************************************
  * Name: sigexit
  ****************************************************************************/
@@ -99,6 +100,7 @@ static void sigexit(int signo)
 {
   g_exiting = true;
 }
+#endif
 
 /****************************************************************************
  * Name: ping_newid
@@ -199,7 +201,9 @@ void icmp_ping(FAR const struct ping_info_s *info)
   int i;
 
   g_exiting = false;
+#ifdef CONFIG_ENABLE_ALL_SIGNALS
   signal(SIGINT, sigexit);
+#endif
 
   /* Initialize result structure */
 
diff --git a/netutils/telnetd/telnetd_daemon.c 
b/netutils/telnetd/telnetd_daemon.c
index ed02b1569..989de34f9 100644
--- a/netutils/telnetd/telnetd_daemon.c
+++ b/netutils/telnetd/telnetd_daemon.c
@@ -74,7 +74,7 @@ int telnetd_daemon(FAR const struct telnetd_config_s *config)
 #endif
   } addr;
 
-#ifdef CONFIG_SCHED_HAVE_PARENT
+#if defined(CONFIG_SCHED_HAVE_PARENT) && defined(CONFIG_ENABLE_ALL_SIGNALS)
   struct sigaction sa;
   sigset_t blockset;
 #endif
@@ -85,7 +85,7 @@ int telnetd_daemon(FAR const struct telnetd_config_s *config)
   int optval;
 #endif
 
-#ifdef CONFIG_SCHED_HAVE_PARENT
+#if defined(CONFIG_SCHED_HAVE_PARENT) && defined(CONFIG_ENABLE_ALL_SIGNALS)
   /* Call sigaction with the SA_NOCLDWAIT flag so that we do not transform
    * children into "zombies" when they terminate:  Child exit status will
    * not be retained.
@@ -113,7 +113,7 @@ int telnetd_daemon(FAR const struct telnetd_config_s 
*config)
       nerr("ERROR: sigprocmask failed: %d\n", errno);
       goto errout;
     }
-#endif /* CONFIG_SCHED_HAVE_PARENT */
+#endif /* CONFIG_SCHED_HAVE_PARENT && CONFIG_ENABLE_ALL_SIGNALS */
 
   /* Create a new TCP socket to use to listen for connections */
 
diff --git a/nshlib/nsh_builtin.c b/nshlib/nsh_builtin.c
index 196220f41..76f542f8f 100644
--- a/nshlib/nsh_builtin.c
+++ b/nshlib/nsh_builtin.c
@@ -74,10 +74,14 @@ int nsh_builtin(FAR struct nsh_vtbl_s *vtbl, FAR const char 
*cmd,
                 FAR char **argv,
                 FAR const struct nsh_param_s *param)
 {
-#if !defined(CONFIG_NSH_DISABLEBG) && defined(CONFIG_SCHED_CHILD_STATUS)
+#if !defined(CONFIG_NSH_DISABLEBG) && defined(CONFIG_SCHED_CHILD_STATUS) && \
+    defined(CONFIG_ENABLE_ALL_SIGNALS)
   struct sigaction act;
   struct sigaction old;
-#endif
+#endif /* !CONFIG_NSH_DISABLEBG && CONFIG_SCHED_CHILD_STATUS &&
+        * CONFIG_ENABLE_ALL_SIGNALS
+        */
+
   int ret = OK;
 
   /* Lock the scheduler in an attempt to prevent the application from
@@ -86,7 +90,8 @@ int nsh_builtin(FAR struct nsh_vtbl_s *vtbl, FAR const char 
*cmd,
 
   sched_lock();
 
-#if !defined(CONFIG_NSH_DISABLEBG) && defined(CONFIG_SCHED_CHILD_STATUS)
+#if !defined(CONFIG_NSH_DISABLEBG) && \
+    defined(CONFIG_SCHED_CHILD_STATUS) && defined(CONFIG_ENABLE_ALL_SIGNALS)
   /* Ignore the child status if run the application on background. */
 
   if (vtbl->np.np_bg == true)
@@ -98,7 +103,9 @@ int nsh_builtin(FAR struct nsh_vtbl_s *vtbl, FAR const char 
*cmd,
       sigaction(SIGCHLD, &act, &old);
     }
 
-#endif /* CONFIG_NSH_DISABLEBG */
+#endif /* !CONFIG_NSH_DISABLEBG && !CONFIG_SCHED_CHILD_STATUS &&
+        * CONFIG_ENABLE_ALL_SIGNALS
+        */
 
   /* Try to find and execute the command within the list of builtin
    * applications.
@@ -230,7 +237,8 @@ int nsh_builtin(FAR struct nsh_vtbl_s *vtbl, FAR const char 
*cmd,
 
 #if !defined(CONFIG_SCHED_WAITPID) || !defined(CONFIG_NSH_DISABLEBG)
         {
-#if !defined(CONFIG_NSH_DISABLEBG) && defined(CONFIG_SCHED_CHILD_STATUS)
+#if !defined(CONFIG_NSH_DISABLEBG) && defined(CONFIG_SCHED_CHILD_STATUS) && \
+    defined(CONFIG_ENABLE_ALL_SIGNALS)
 
           /* Restore the old actions */
 
@@ -241,7 +249,10 @@ int nsh_builtin(FAR struct nsh_vtbl_s *vtbl, FAR const 
char *cmd,
               sigaction(SIGCHLD, &old, NULL);
             }
 
-#  endif
+#  endif /* !CONFIG_NSH_DISABLEBG && CONFIG_SCHED_CHILD_STATUS && \
+          * CONFIG_ENABLE_ALL_SIGNALS
+          */
+
           struct sched_param sched;
           sched_getparam(ret, &sched);
           nsh_output(vtbl, "%s [%d:%d]\n", cmd, ret, sched.sched_priority);
diff --git a/nshlib/nsh_proccmds.c b/nshlib/nsh_proccmds.c
index fe9810564..c7eff26eb 100644
--- a/nshlib/nsh_proccmds.c
+++ b/nshlib/nsh_proccmds.c
@@ -873,6 +873,7 @@ static int top_cmpcpuload(FAR const void *item1, FAR const 
void *item2)
     }
 }
 
+#ifdef CONFIG_ENABLE_ALL_SIGNALS
 /****************************************************************************
  * Name: top_exit
  ****************************************************************************/
@@ -881,6 +882,7 @@ static void top_exit(int signo, FAR siginfo_t *siginfo, FAR 
void *context)
 {
   *(FAR bool *)siginfo->si_user = true;
 }
+#endif /* CONFIG_ENABLE_ALL_SIGNALS */
 
 #endif
 
@@ -1357,7 +1359,9 @@ int cmd_top(FAR struct nsh_vtbl_s *vtbl, int argc, FAR 
char **argv)
   FAR char *pidlist = NULL;
   size_t num = SIZE_MAX;
   size_t i;
+#ifdef CONFIG_ENABLE_ALL_SIGNALS
   struct sigaction act;
+#endif
   bool quit = false;
   int delay = 3;
   int ret = 0;
@@ -1393,6 +1397,7 @@ int cmd_top(FAR struct nsh_vtbl_s *vtbl, int argc, FAR 
char **argv)
         }
     }
 
+#ifdef CONFIG_ENABLE_ALL_SIGNALS
   act.sa_user = &quit;
   act.sa_sigaction = top_exit;
   sigemptyset(&act.sa_mask);
@@ -1402,6 +1407,7 @@ int cmd_top(FAR struct nsh_vtbl_s *vtbl, int argc, FAR 
char **argv)
       nsh_error(vtbl, g_fmtcmdfailed, "top", "sigaction", NSH_ERRNO);
       return ERROR;
     }
+#endif
 
   if (vtbl->isctty)
     {
diff --git a/system/cu/cu_main.c b/system/cu/cu_main.c
index 8d25038ed..1e991460d 100644
--- a/system/cu/cu_main.c
+++ b/system/cu/cu_main.c
@@ -124,10 +124,12 @@ static FAR void *cu_listener(FAR void *parameter)
   return NULL;
 }
 
+#ifdef CONFIG_ENABLE_ALL_SIGNALS
 static void sigint(int sig)
 {
   g_cu.force_exit = true;
 }
+#endif
 
 #ifdef CONFIG_SERIAL_TERMIOS
 static int set_termios(FAR struct cu_globals_s *cu, int rate,
@@ -275,7 +277,9 @@ static int cu_cmd(FAR struct cu_globals_s *cu, char bcmd)
 int main(int argc, FAR char *argv[])
 {
   pthread_attr_t attr;
+#ifdef CONFIG_ENABLE_ALL_SIGNALS
   struct sigaction sa;
+#endif
   FAR const char *devname = CONFIG_SYSTEM_CUTERM_DEFAULT_DEVICE;
   FAR struct cu_globals_s *cu = &g_cu;
 #ifdef CONFIG_SERIAL_TERMIOS
@@ -295,13 +299,13 @@ int main(int argc, FAR char *argv[])
 
   memset(cu, 0, sizeof(*cu));
   cu->escape = '~';
-
+#ifdef CONFIG_ENABLE_ALL_SIGNALS
   /* Install signal handlers */
 
   memset(&sa, 0, sizeof(sa));
   sa.sa_handler = sigint;
   sigaction(SIGINT, &sa, NULL);
-
+#endif
   optind = 0;   /* Global that needs to be reset in FLAT mode */
   while ((option = getopt(argc, argv, "l:s:ceE:fho?")) != ERROR)
     {
diff --git a/testing/ostest/ostest_main.c b/testing/ostest/ostest_main.c
index 48dc94da7..975a10410 100644
--- a/testing/ostest/ostest_main.c
+++ b/testing/ostest/ostest_main.c
@@ -278,7 +278,8 @@ static int user_main(int argc, char *argv[])
    * verify that status is retained correctly.
    */
 
-#if defined(CONFIG_SCHED_HAVE_PARENT) && defined(CONFIG_SCHED_CHILD_STATUS)
+#if defined(CONFIG_SCHED_HAVE_PARENT) && defined(CONFIG_SCHED_CHILD_STATUS) && 
\
+    defined(CONFIG_ENABLE_ALL_SIGNALS)
     {
       struct sigaction sa;
       int ret;
@@ -511,12 +512,22 @@ static int user_main(int argc, char *argv[])
       check_test_memory_usage();
 #endif
 
+#ifndef CONFIG_DISABLE_ALL_SIGNALS
       /* Verify that we can modify the signal mask */
 
       printf("\nuser_main: sigprocmask test\n");
       sigprocmask_test();
       check_test_memory_usage();
 
+#if defined(CONFIG_SIG_SIGSTOP_ACTION) && defined(CONFIG_SIG_SIGKILL_ACTION) 
&& \
+    !defined(CONFIG_BUILD_KERNEL)
+      printf("\nuser_main: signal action test\n");
+      suspend_test();
+      check_test_memory_usage();
+#endif
+#endif /* !CONFIG_DISABLE_ALL_SIGNALS */
+
+#ifdef CONFIG_ENABLE_ALL_SIGNALS
       /* Verify signal handlers */
 
       printf("\nuser_main: signal handler test\n");
@@ -527,12 +538,14 @@ static int user_main(int argc, char *argv[])
       signest_test();
       check_test_memory_usage();
 
-#if defined(CONFIG_SIG_SIGSTOP_ACTION) && defined(CONFIG_SIG_SIGKILL_ACTION) 
&& \
-    !defined(CONFIG_BUILD_KERNEL)
-      printf("\nuser_main: signal action test\n");
-      suspend_test();
+#ifndef CONFIG_DISABLE_POSIX_TIMERS
+      /* Verify posix timers (with SIGEV_SIGNAL) */
+
+      printf("\nuser_main: POSIX timer test\n");
+      timer_test();
       check_test_memory_usage();
 #endif
+#endif
 
 #ifdef CONFIG_BUILD_FLAT
       printf("\nuser_main: wdog test\n");
@@ -540,21 +553,14 @@ static int user_main(int argc, char *argv[])
       check_test_memory_usage();
 #endif
 
-#ifndef CONFIG_DISABLE_POSIX_TIMERS
-      /* Verify posix timers (with SIGEV_SIGNAL) */
-
-      printf("\nuser_main: POSIX timer test\n");
-      timer_test();
-      check_test_memory_usage();
-
-#ifdef CONFIG_SIG_EVTHREAD
+#if !defined(CONFIG_DISABLE_POSIX_TIMERS) && \
+    defined(CONFIG_SIG_EVTHREAD)
       /* Verify posix timers (with SIGEV_THREAD) */
 
       printf("\nuser_main: SIGEV_THREAD timer test\n");
       sigev_thread_test();
       check_test_memory_usage();
 #endif
-#endif
 
 #if !defined(CONFIG_DISABLE_PTHREAD) && CONFIG_RR_INTERVAL > 0
       /* Verify round robin scheduling */

Reply via email to