24

I'm writing a C program for OS X and Linux, and I want to tweak the output based on whether or not it's going to a terminal. I know we've covered how to do this in a shell script, e.g. here:

Detecting the output stream type of a shell script

But how do I do it in a C program?

Community
  • 1
  • 1
Paul A Jungwirth
  • 23,504
  • 14
  • 74
  • 93

2 Answers2

44

Use isatty():

$ man isatty
ISATTY(3)                  Linux Programmer's Manual                 ISATTY(3)

NAME
       isatty - does this descriptor refer to a terminal

SYNOPSIS
       #include <unistd.h>

       int isatty(int desc);

DESCRIPTION
       returns  1  if  desc is an open file descriptor connected to a terminal
       and 0 otherwise.

Since stdout is always file descriptor 1, you can do:

if(isatty(1))
    // stdout is a terminal
Marco Bonelli
  • 63,369
  • 21
  • 118
  • 128
Laurence Gonsalves
  • 137,896
  • 35
  • 246
  • 299
  • And could you explain a little bit deeper ? What is really checked by this function ? What really means `connected to a terminal` ? – xolodec Feb 08 '14 at 08:13
  • @PavelShvechikov It means the file descriptor is associated with a device that is considered to be a terminal. See http://en.wikipedia.org/wiki/POSIX_terminal_interface – Laurence Gonsalves Feb 08 '14 at 19:28
5
if (isatty (1))
    fprintf (stdout, "Outputting to a terminal.");
else
    fprintf (stdout, "Not outputting to a terminal.");
dreamlax
  • 93,976
  • 29
  • 161
  • 209