diff --git a/src/lpc_signal.c b/src/lpc_signal.c
index 97d7234a376084e3a55cb6a3d7f8f474204a6246..a2659bc411124006931694f8b90a42f68a891abb 100644
--- a/src/lpc_signal.c
+++ b/src/lpc_signal.c
@@ -296,12 +296,6 @@ static void f_signal(int args)
   if(args < 1)
     error("Too few arguments to signal()\n");
 
-  if(args == 1)
-  {
-    push_int(0);
-    args++;
-  }
-  
   if(sp[-args].type != T_INT)
   {
     error("Bad argument 1 to signal()\n");
@@ -313,9 +307,11 @@ static void f_signal(int args)
     error("Signal out of range.\n");
   }
 
-  assign_svalue(signal_callbacks + signum, sp+1-args);
-  if(IS_ZERO(sp+1-args))
+  if(args == 1)
   {
+    push_int(0);
+    args++;
+
     switch(signum)
     {
     case SIGCHLD:
@@ -329,9 +325,15 @@ static void f_signal(int args)
     default:
       func=(sigfunctype) SIG_DFL;
     }
-  }else{
-    func=receive_signal;
+  } else {
+    if(IS_ZERO(sp+1-args))
+    {
+      func=(sigfunctype) SIG_IGN;
+    }else{
+      func=receive_signal;
+    }
   }
+  assign_svalue(signal_callbacks + signum, sp+1-args);
   my_signal(signum, func);
   pop_n_elems(args);
 }