Learn more about Russian war crimes in Ukraine.

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!
  close(1);

  // 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.
  close(new_stdout);

  // 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;
}

What can computers do? What are the limits of mathematics? And just how busy can a busy beaver be? This year, I’m writing Busy Beavers, a unique interactive book on computability theory. You and I will take a practical and modern approach to answering these questions — or at least learning why some questions are unanswerable!

It’s only $19, and you can get 50% off if you find the discount code ... Not quite. Hackers use the console!

After months of secret toil, I and Andrew Carr released Everyday Data Science, a unique interactive online course! You’ll make the perfect glass of lemonade using Thompson sampling. You’ll lose weight with differential equations. And you might just qualify for the Olympics with a bit of statistics!

It’s $29, but you can get 50% off if you find the discount code ... Not quite. Hackers use the console!

More by Jim

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