diff --git a/redox-rt/src/sys.rs b/redox-rt/src/sys.rs
index e9ec7383a8b4034d1acd90e982678d6c2f0829e7..8cc3a0dbc15cd4cf931509e6a8aed6a71599e3bc 100644
--- a/redox-rt/src/sys.rs
+++ b/redox-rt/src/sys.rs
@@ -3,11 +3,10 @@ use syscall::error::{Result, Error, EINTR};
 use crate::arch::manually_enter_trampoline;
 use crate::signal::tmp_disable_signals;
 
-// TODO: uninitialized memory?
 #[inline]
-pub fn posix_read(fd: usize, buf: &mut [u8]) -> Result<usize> {
+fn wrapper(mut f: impl FnMut() -> Result<usize>) -> Result<usize> {
     loop {
-        let res = syscall::read(fd, buf);
+        let res = f();
 
         if res == Err(Error::new(EINTR)) {
             unsafe {
@@ -18,18 +17,27 @@ pub fn posix_read(fd: usize, buf: &mut [u8]) -> Result<usize> {
         return res;
     }
 }
+
+// TODO: uninitialized memory?
+#[inline]
+pub fn posix_read(fd: usize, buf: &mut [u8]) -> Result<usize> {
+    wrapper(|| syscall::read(fd, buf))
+}
 #[inline]
 pub fn posix_write(fd: usize, buf: &[u8]) -> Result<usize> {
-    loop {
-        let res = syscall::write(fd, buf);
-
-        if res == Err(Error::new(EINTR)) {
-            unsafe {
-                manually_enter_trampoline();
-            }
-        }
-
-        return res;
-
+    wrapper(|| syscall::write(fd, buf))
+}
+#[inline]
+pub fn posix_kill(pid: usize, sig: usize) -> Result<()> {
+    match wrapper(|| syscall::kill(pid, sig)) {
+        Ok(_) | Err(Error { errno: EINTR }) => Ok(()),
+        Err(error) => Err(error),
+    }
+}
+#[inline]
+pub fn posix_killpg(pgrp: usize, sig: usize) -> Result<()> {
+    match wrapper(|| syscall::kill(usize::wrapping_neg(pgrp), sig)) {
+        Ok(_) | Err(Error { errno: EINTR }) => Ok(()),
+        Err(error) => Err(error),
     }
 }
diff --git a/src/platform/redox/signal.rs b/src/platform/redox/signal.rs
index dc5e816ff2fa5f349ce55b40688f5139d6825315..ce156d1dea25cb6556b0a201297ce17d3c5ded88 100644
--- a/src/platform/redox/signal.rs
+++ b/src/platform/redox/signal.rs
@@ -53,11 +53,11 @@ impl PalSignal for Sys {
     }
 
     fn kill(pid: pid_t, sig: c_int) -> c_int {
-        e(syscall::kill(pid as usize, sig as usize)) as c_int
+        e(redox_rt::sys::posix_kill(pid as usize, sig as usize).map(|()| 0)) as c_int
     }
 
     fn killpg(pgrp: pid_t, sig: c_int) -> c_int {
-        e(syscall::kill(-(pgrp as isize) as usize, sig as usize)) as c_int
+        e(redox_rt::sys::posix_killpg(pgrp as usize, sig as usize).map(|()| 0)) as c_int
     }
 
     fn raise(sig: c_int) -> c_int {