diff --git a/libc/signal.cc b/libc/signal.cc
index 122f689ff5e2c13ce5fb210983c536104945edf1..44606941ad8ea5e46fdb0134cafaf55771e28c47 100644
--- a/libc/signal.cc
+++ b/libc/signal.cc
@@ -151,12 +151,12 @@ int sigaction(int signum, const struct sigaction* act, struct sigaction* oldact)
 
 // using signal() is not recommended (use sigaction instead!), but some
 // programs like to call to do simple things, like ignoring a certain signal.
-sighandler_t signal(int signum, sighandler_t handler)
+static sighandler_t signal(int signum, sighandler_t handler, int sa_flags)
 {
     struct sigaction act;
     memset(&act, 0, sizeof(act));
     act.sa_handler = handler;
-    act.sa_flags = SA_RESTART;
+    act.sa_flags = sa_flags;
     struct sigaction old;
     if (sigaction(signum, &act, &old) < 0) {
         return SIG_ERR;
@@ -169,6 +169,17 @@ sighandler_t signal(int signum, sighandler_t handler)
     }
 }
 
+sighandler_t signal(int signum, sighandler_t handler)
+{
+    return signal(signum, handler, SA_RESTART);
+}
+
+extern "C"
+sighandler_t __sysv_signal(int signum, sighandler_t handler)
+{
+    return signal(signum, handler, SA_RESETHAND | SA_NODEFER);
+}
+
 // using sigignore() and friends is not recommended as it is obsolete System V
 // APIs. Nevertheless, some programs use it.
 int sigignore(int signum)