Recently I was writing a small experimental program under GNU/Linux. My tiny application needed input from terminal.
I need to find out name of a terminal. Further, I need to know if a particular file descriptor is a tty device or not.
I found ttyname() function which accepts an open file descriptor as its input argument and returns a pointer to the null-terminated pathname of the terminal device.
But how did I know if descriptor refer to a terminal is tty? Simply use C function isatty(desc) which returns 1 if desc is an open descriptor connected to a terminal and 0 else.
Desc can be any one of the following:
- 0 : Standard input (like keyboard)
- 1 : Standard output (like screen)
- 2 : Standard error (like screen)
Under normal circumstances every Linux program has three streams opened for it when it starts up, one for input, one for output, and one for printing diagnostic or error messages. These are typically attached to the user's terminal but might instead refer to files or other devices, depending on what the parent process chose to set up.
On program startup, the integer file descriptors associated with the streams stdin, stdout, and stderr are 0, 1, and 2, respectively.
Here is sample C guesstty.c program listing:
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv){
int t,fd;
if ( argc == 1 ){
printf("Syntax: %s 0,1,2\n",argv[0]);
exit(EXIT_SUCCESS);
}
fd = atoi(argv[1]);
t = isatty(fd);
if( t )
printf("fd is %d, which is a tty\n",fd);
else
printf("fd is %d, which isn't a tty\n",fd);
if ( t == 1 ) printf("tty name is %s\n",ttyname(t));
return EXIT_SUCCESS;
}
The above code can tell when the standard input is redirected to take data from a file or when the data is coming from terminal.
Compile and run program:
[code]$ make guesstty.c[/code]
OR
[code]$ cc guesstty.c -o guesstty [/code]
Sample run:
[code]$ ./guesstty 0[/code]Output:
fd is 0, which is a tty
tty name is /dev/pts/1
[code]$ ./guesstty 0 Output:
fd is 0, which isn't a tty
References:
- ttyname(3)
- isatty(3)
You should follow me on twitter here or grab rss feed to keep track of new changes.
Featured Articles:
- 30 Handy Bash Shell Aliases For Linux / Unix / Mac OS X
- Top 30 Nmap Command Examples For Sys/Network Admins
- 25 PHP Security Best Practices For Sys Admins
- 20 Linux System Monitoring Tools Every SysAdmin Should Know
- 20 Linux Server Hardening Security Tips
- Linux: 20 Iptables Examples For New SysAdmins
- Top 20 OpenSSH Server Best Security Practices
- Top 20 Nginx WebServer Best Security Practices
- 20 Examples: Make Sure Unix / Linux Configuration Files Are Free From Syntax Errors
- 15 Greatest Open Source Terminal Applications Of 2012

- My 10 UNIX Command Line Mistakes
- Top 10 Open Source Web-Based Project Management Software
- Top 5 Email Client For Linux, Mac OS X, and Windows Users
- The Novice Guide To Buying A Linux Laptop













{ 0 comments… add one now }