diff --git a/src/platform/src/linux/mod.rs b/src/platform/src/linux/mod.rs
index dd99868f0d233b1194e8e7dd5ce663f8f896c41d..279929d97083a70f6a4f49fc57bca284aa0b8a21 100644
--- a/src/platform/src/linux/mod.rs
+++ b/src/platform/src/linux/mod.rs
@@ -115,6 +115,14 @@ pub fn getuid() -> uid_t {
     e(unsafe { syscall!(GETUID) })
 }
 
+pub fn kill(pid: pid_t, sig: c_int) -> c_int {
+    e(unsafe { syscall!(KILL, pid, sig) }) as c_int
+}
+
+pub fn killpg(pgrp: pid_t, sig: c_int) -> c_int {
+    e(unsafe { syscall!(KILL, -(pgrp as isize) as pid_t, sig) }) as c_int
+}
+
 pub fn link(path1: *const c_char, path2: *const c_char) -> c_int {
     e(unsafe { syscall!(LINKAT, AT_FDCWD, path1, AT_FDCWD, path2, 0) }) as c_int
 }
@@ -174,3 +182,7 @@ pub fn waitpid(pid: pid_t, stat_loc: *mut c_int, options: c_int) -> pid_t {
 pub fn write(fildes: c_int, buf: &[u8]) -> ssize_t {
     e(unsafe { syscall!(WRITE, fildes, buf.as_ptr(), buf.len()) }) as ssize_t
 }
+
+pub fn clock_gettime(clk_id: clockid_t, tp: *mut timespec) -> c_int {
+    e(unsafe { syscall!(CLOCK_GETTIME, clk_id, tp) }) as c_int
+}
diff --git a/src/platform/src/redox/mod.rs b/src/platform/src/redox/mod.rs
index 7ffc2960778a04e79789fdd43bfca21841018b56..8ba393d7142781fb723c077fb2301cb67345c1da 100644
--- a/src/platform/src/redox/mod.rs
+++ b/src/platform/src/redox/mod.rs
@@ -119,6 +119,14 @@ pub fn getuid() -> uid_t {
     e(syscall::getuid()) as pid_t
 }
 
+pub fn kill(pid: pid_t, sig: c_int) -> c_int {
+    e(syscall::kill(pid, sig as usize)) as c_int
+}
+
+pub fn killpg(pgrp: pid_t, sig: c_int) -> c_int {
+    e(syscall::kill(-(pgrp as isize) as pid_t, sig as usize)) as c_int
+}
+
 pub fn link(path1: *const c_char, path2: *const c_char) -> c_int {
     let path1 = unsafe { c_str(path1) };
     let path2 = unsafe { c_str(path2) };
@@ -232,3 +240,17 @@ pub fn waitpid(pid: pid_t, stat_loc: *mut c_int, options: c_int) -> pid_t {
 pub fn write(fd: c_int, buf: &[u8]) -> ssize_t {
     e(syscall::write(fd as usize, buf)) as ssize_t
 }
+
+pub fn clock_gettime(clk_id: clockid_t, tp: *mut timespec) -> c_int {
+    let mut redox_tp = unsafe { redox_timespec::from(&*tp) };
+    match e(syscall::clock_gettime(clk_id as usize, &mut redox_tp)) as c_int {
+        -1 => -1,
+        _ => {
+            unsafe {
+                (*tp).tv_sec = redox_tp.tv_sec;
+                (*tp).tv_nsec = redox_tp.tv_nsec as i64;
+            };
+            0
+        }
+    }
+}
diff --git a/src/platform/src/types.rs b/src/platform/src/types.rs
index d6e19dbd580c8ad2b5bbbe1934cacabacc1bfc22..722fe706cea36f29e808c6dfd4bb79ae5cf9a9f1 100644
--- a/src/platform/src/types.rs
+++ b/src/platform/src/types.rs
@@ -68,6 +68,7 @@ pub type clockid_t = i32;
 pub type timer_t = c_void;
 
 #[repr(C)]
+#[derive(Default)]
 pub struct timespec {
     pub tv_sec: time_t,
     pub tv_nsec: c_long,
diff --git a/src/signal/src/lib.rs b/src/signal/src/lib.rs
index 052cb13770eb2790ff5d12953652e06ddb42b2fc..031b8e4836cb844c1766b1fb57a5b6e43c235a6a 100644
--- a/src/signal/src/lib.rs
+++ b/src/signal/src/lib.rs
@@ -27,12 +27,12 @@ pub type sigset_t = sys_sigset_t;
 
 #[no_mangle]
 pub extern "C" fn kill(pid: pid_t, sig: c_int) -> c_int {
-    unimplemented!();
+    platform::kill(pid, sig)
 }
 
 #[no_mangle]
 pub extern "C" fn killpg(pgrp: pid_t, sig: c_int) -> c_int {
-    unimplemented!();
+    platform::killpg(pgrp, sig)
 }
 
 #[no_mangle]
diff --git a/src/time/cbindgen.toml b/src/time/cbindgen.toml
index ef3a5240e6d6dd30ae2b1b7421ecc5f4783a7f8f..40448b8f899a567c7c044c9f5705a89d65e7a8e8 100644
--- a/src/time/cbindgen.toml
+++ b/src/time/cbindgen.toml
@@ -4,3 +4,7 @@ language = "C"
 
 [enum]
 prefix_with_name = true
+
+[defines]
+"target_os = linux" = "__linux__"
+"target_os = redox" = "__redox__"
diff --git a/src/time/src/lib.rs b/src/time/src/lib.rs
index 5b90e86f7482758341965c01524964cb4af57da7..5835d7014b7e01ae01e4ab067b27eff14a060c97 100644
--- a/src/time/src/lib.rs
+++ b/src/time/src/lib.rs
@@ -6,6 +6,33 @@ extern crate platform;
 
 use platform::types::*;
 
+#[cfg(target_os = "redox")]
+pub const CLOCK_REALTIME: c_int = 1;
+#[cfg(target_os = "redox")]
+pub const CLOCK_MONOTONIC: c_int = 4;
+#[cfg(target_os = "linux")]
+pub const CLOCK_REALTIME: c_int = 0;
+#[cfg(target_os = "linux")]
+pub const CLOCK_MONOTONIC: c_int = 1;
+#[cfg(target_os = "linux")]
+pub const CLOCK_PROCESS_CPUTIME_ID: c_int = 2;
+#[cfg(target_os = "linux")]
+pub const CLOCK_THREAD_CPUTIME_ID: c_int = 3;
+#[cfg(target_os = "linux")]
+pub const CLOCK_MONOTONIC_RAW: c_int = 4;
+#[cfg(target_os = "linux")]
+pub const CLOCK_REALTIME_COARSE: c_int = 5;
+#[cfg(target_os = "linux")]
+pub const CLOCK_MONOTONIC_COARSE: c_int = 6;
+#[cfg(target_os = "linux")]
+pub const CLOCK_BOOTTIME: c_int = 7;
+#[cfg(target_os = "linux")]
+pub const CLOCK_REALTIME_ALARM: c_int = 8;
+#[cfg(target_os = "linux")]
+pub const CLOCK_BOOTTIME_ALARM: c_int = 9;
+#[cfg(target_os = "linux")]
+pub const CLOCK_TAI: c_int = 11;
+
 /*
  *#[repr(C)]
  *pub struct timespec {
@@ -59,7 +86,7 @@ pub extern "C" fn clock_getres(clock_id: clockid_t, res: *mut timespec) -> c_int
 
 #[no_mangle]
 pub extern "C" fn clock_gettime(clock_id: clockid_t, tp: *mut timespec) -> c_int {
-    unimplemented!();
+    platform::clock_gettime(clock_id, tp)
 }
 
 #[no_mangle]
@@ -134,7 +161,14 @@ pub extern "C" fn strptime(buf: *const c_char, format: *const c_char, tm: *mut t
 
 #[no_mangle]
 pub extern "C" fn time(tloc: *mut time_t) -> time_t {
-    unimplemented!();
+    let mut ts: timespec = Default::default();
+    platform::clock_gettime(CLOCK_REALTIME, &mut ts);
+    unsafe {
+        if !tloc.is_null() {
+            *tloc = ts.tv_sec
+        };
+    }
+    ts.tv_sec
 }
 
 #[no_mangle]
diff --git a/tests/.gitignore b/tests/.gitignore
index a781bd7b7f34963e20212c15f1c90a0324846e5f..a7b3b569fc0b3462b9084f92c62558afde3bafeb 100644
--- a/tests/.gitignore
+++ b/tests/.gitignore
@@ -48,4 +48,4 @@
 /unlink
 /waitpid
 /write
-
+/time
diff --git a/tests/Makefile b/tests/Makefile
index d8bb21c007a529b9d258a09fcb8e81ee91f6343a..3f68491a04857e20713cbd36caaf5593cf3ac6df 100644
--- a/tests/Makefile
+++ b/tests/Makefile
@@ -42,7 +42,8 @@ EXPECT_BINS=\
 	unistd/getopt \
 	unlink \
 	waitpid \
-	write
+	write \
+	time
 
 # Binaries that may generate varied output
 BINS=\
diff --git a/tests/time.c b/tests/time.c
new file mode 100644
index 0000000000000000000000000000000000000000..e6ce164c2585ff7ebfbade6412bb90e057d638c9
--- /dev/null
+++ b/tests/time.c
@@ -0,0 +1,11 @@
+#include <time.h>
+#include <stdio.h>
+
+int main(int argc, char** argv) {
+    timespec tm = {0, 0};
+    clock_gettime(CLOCK_REALTIME, &tm);
+    perror("clock_gettime");
+    time(NULL);
+    perror("time");
+    return 0;
+}