How do I close a file descriptor in C?

To close a file descriptor, we use the close system call. Here’s an example:

#include <unistd.h>
#include <assert.h>
#include <stdio.h>

#define WRITE(F, S) write((F), (S), sizeof(S))

int main(void) {
  // Do some normal writing.
  assert(0 < WRITE(1, "This is written to stdout via descriptor 1\n"));

  // Get another reference to the same stdout pipe.
  int new_stdout = dup(1);

  // Writing to the new reference also works.
  assert(0 < WRITE(new_stdout, "This is written to stdout via new descriptor\n"));

  // Close our original file descriptor to stdout!

  // Writing to our new reference still works.
  // The pipe is only closed when all references to it are closed.
  assert(0 < WRITE(new_stdout, "This is also written to stdout via new descriptor\n"));

  // Close our final reference to the stdout pipe.
  // This closes the write end of the pipe.

  // Now we can't write to the pipe, because the write end of the pipe has been closed.
  assert(-1 == WRITE(new_stdout, "This should break\n"));
  perror("Could not write to new_stdout");

  return 0;
I just released Vidrio, a free app for macOS and Windows to make your screen-sharing awesomely holographic. Vidrio shows your webcam video on your screen, just like a mirror. Then you just share or record your screen with Zoom, QuickTime, or any other app. Vidrio makes your presentations effortlessly engaging, showing your gestures, gazes, and expressions. #1 on Product Hunt. Available for macOS and Windows.

With Vidrio

With generic competitor

More by Jim

Tagged . All content copyright James Fisher 2017. This post is not associated with my employer. Found an error? Edit this page.