diff --git a/libc/fd.cc b/libc/fd.cc
index 3b6ee8d96f66fba361eebbe72451bcb47d1b8ea6..7130d981f3e4732ff49da5634afb50e382510dc6 100644
--- a/libc/fd.cc
+++ b/libc/fd.cc
@@ -73,6 +73,15 @@ int open(const char* fname, int mode, ...)
     });
 }
 
+int close(int fd)
+{
+    if (fd < 0 || unsigned(fd) >= file_table.size()) {
+        return libc_error(EBADF);
+    }
+    file_table[fd].reset();
+    return 0;
+}
+
 std::shared_ptr<file_desc> get_fd(int fd)
 {
     if (fd < 0) {