diff --git a/src/lpc_signal.c b/src/lpc_signal.c
index 1195d0388f994ff823bf0df0539923628063f72c..b149afe867a8862ae66bc8c481904c84347a7f42 100644
--- a/src/lpc_signal.c
+++ b/src/lpc_signal.c
@@ -13,6 +13,10 @@
 #include <signal.h>
 #include <sys/wait.h>
 
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
 #ifdef NSIG
 #define MAX_SIGNALS NSIG
 #else
@@ -369,6 +373,22 @@ static void f_getpid(INT32 args)
   push_int(getpid());
 }
 
+static void f_alarm(INT32 args)
+{
+  long seconds;
+
+  if(args < 1)
+    error("Too few arguments to signame()\n");
+
+  if(sp[-args].type != T_INT)
+    error("Bad argument 1 to signame()\n");
+
+  seconds=sp[-args].u.integer;
+
+  pop_n_elems(args);
+  push_int(alarm(seconds));
+}
+
 void init_signals()
 {
   int e;
@@ -386,6 +406,7 @@ void init_signals()
   add_efun("signame",f_signame,"function(int:string)",0);
   add_efun("signum",f_signum,"function(string:int)",0);
   add_efun("getpid",f_getpid,"function(:int)",0);
+  add_efun("alarm",f_alarm,"function(int:int)",OPT_SIDE_EFFECT);
 }
 
 void exit_signals()