diff --git a/Cargo.lock b/Cargo.lock
index 6f2ce4c5c5274c5e3fc84824ba5b7f782c0325e6..34baa0b6abecafc77ec49e2247e1f1b91678d108 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -390,9 +390,9 @@ dependencies = [
 
 [[package]]
 name = "redox_syscall"
-version = "0.5.4"
+version = "0.5.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0884ad60e090bf1345b93da0a5de8923c93884cd03f40dfcfddd3b4bee661853"
+checksum = "62871f2d65009c0256aed1b9cfeeb8ac272833c404e13d53d400cd0dad7a2ac0"
 dependencies = [
  "bitflags",
 ]
diff --git a/Cargo.toml b/Cargo.toml
index cc46f4547644f1de3c0074779e8c6daae9db2a3d..668f1ac578f9e125d2b8bfbe07a18c2369dc5f2e 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -59,7 +59,7 @@ features = ["c_api"]
 sc = "0.2.3"
 
 [target.'cfg(target_os = "redox")'.dependencies]
-redox_syscall = "0.5.4"
+redox_syscall = "0.5.5"
 redox-rt = { path = "redox-rt" }
 redox-path = "0.2"
 redox_event = { git = "https://gitlab.redox-os.org/redox-os/event.git", default-features = false, features = ["redox_syscall"] }
diff --git a/redox-rt/src/sys.rs b/redox-rt/src/sys.rs
index 2e2db371234cd8bd82496c19d2dd24336f4a3333..7566f63f389ef7924179e334ec7c321488d690b8 100644
--- a/redox-rt/src/sys.rs
+++ b/redox-rt/src/sys.rs
@@ -44,6 +44,13 @@ pub fn posix_kill(pid: usize, sig: usize) -> Result<()> {
     }
 }
 #[inline]
+pub fn posix_sigqueue(pid: usize, sig: usize, val: usize) -> Result<()> {
+    match wrapper(false, || unsafe { syscall::syscall3(101, pid, sig, val) }) {
+        Ok(_) | Err(Error { errno: EINTR }) => Ok(()),
+        Err(error) => Err(error),
+    }
+}
+#[inline]
 pub fn posix_killpg(pgrp: usize, sig: usize) -> Result<()> {
     match wrapper(false, || syscall::kill(usize::wrapping_neg(pgrp), sig)) {
         Ok(_) | Err(Error { errno: EINTR }) => Ok(()),
diff --git a/src/header/signal/mod.rs b/src/header/signal/mod.rs
index ffde0d51662a555ebee2d695a67c352a074a385a..f3c58111a5122f33150cffa019f427b555f8314d 100644
--- a/src/header/signal/mod.rs
+++ b/src/header/signal/mod.rs
@@ -67,6 +67,11 @@ pub struct siginfo {
 #[no_mangle]
 pub extern "C" fn _cbindgen_export_siginfo(a: siginfo) {}
 
+pub union sigval {
+    pub si_int: c_int,
+    pub si_ptr: *mut c_void,
+}
+
 /// cbindgen:ignore
 pub type sigset_t = c_ulonglong;
 /// cbindgen:ignore
@@ -78,6 +83,12 @@ pub type stack_t = sigaltstack;
 pub extern "C" fn kill(pid: pid_t, sig: c_int) -> c_int {
     Sys::kill(pid, sig)
 }
+#[no_mangle]
+pub extern "C" fn sigqueue(pid: pid_t, sig: c_int, val: sigval) -> c_int {
+    Sys::sigqueue(pid, sig, val)
+        .map(|()| 0)
+        .or_minus_one_errno()
+}
 
 #[no_mangle]
 pub extern "C" fn killpg(pgrp: pid_t, sig: c_int) -> c_int {
diff --git a/src/platform/pal/signal.rs b/src/platform/pal/signal.rs
index e661eef4b7b7e69c11e71008a3153788e5a5c3b6..b00525a83403e8f101a38e6c17be1e2fcb63ad68 100644
--- a/src/platform/pal/signal.rs
+++ b/src/platform/pal/signal.rs
@@ -2,7 +2,7 @@ use super::super::{types::*, Pal};
 use crate::{
     error::Errno,
     header::{
-        signal::{sigaction, siginfo_t, sigset_t, stack_t},
+        signal::{sigaction, siginfo_t, sigset_t, sigval, stack_t},
         sys_time::itimerval,
         time::timespec,
     },
@@ -13,6 +13,8 @@ pub trait PalSignal: Pal {
 
     fn kill(pid: pid_t, sig: c_int) -> c_int;
 
+    fn sigqueue(pid: pid_t, sig: c_int, val: sigval) -> Result<(), Errno>;
+
     fn killpg(pgrp: pid_t, sig: c_int) -> c_int;
 
     fn raise(sig: c_int) -> Result<(), Errno>;
diff --git a/src/platform/redox/signal.rs b/src/platform/redox/signal.rs
index f6dfc9747b066913acbab36db5a3768be67224d3..1f71784f86bf74ec55bf615e33bff3cadfef52c4 100644
--- a/src/platform/redox/signal.rs
+++ b/src/platform/redox/signal.rs
@@ -11,8 +11,8 @@ use crate::{
     header::{
         errno::{EINVAL, ENOSYS},
         signal::{
-            sigaction, siginfo_t, sigset_t, stack_t, SA_SIGINFO, SIG_BLOCK, SIG_DFL, SIG_IGN,
-            SIG_SETMASK, SIG_UNBLOCK, SS_DISABLE, SS_ONSTACK,
+            sigaction, siginfo_t, sigset_t, sigval, stack_t, SA_SIGINFO, SIG_BLOCK, SIG_DFL,
+            SIG_IGN, SIG_SETMASK, SIG_UNBLOCK, SS_DISABLE, SS_ONSTACK,
         },
         sys_time::{itimerval, ITIMER_REAL},
         time::timespec,
@@ -55,6 +55,13 @@ impl PalSignal for Sys {
     fn kill(pid: pid_t, sig: c_int) -> c_int {
         e(redox_rt::sys::posix_kill(pid as usize, sig as usize).map(|()| 0)) as c_int
     }
+    fn sigqueue(pid: pid_t, sig: c_int, val: sigval) -> Result<(), Errno> {
+        Ok(redox_rt::sys::posix_sigqueue(
+            pid as usize,
+            sig as usize,
+            unsafe { val.si_ptr } as usize,
+        )?)
+    }
 
     fn killpg(pgrp: pid_t, sig: c_int) -> c_int {
         e(redox_rt::sys::posix_killpg(pgrp as usize, sig as usize).map(|()| 0)) as c_int