My program (a text editor) enters raw mode of terminal like this:
tcsetattr(STDIN_FILENO, TCSAFLUSH, &raw)
so that it can read key strokes, draw using escape codes etc.
But now I want to do this: echo hello | myprog, to read stdin from a pipe and then display it in the program UI. But now STDIN_FILENO points to a pipe not to a terminal and tcsetattr fails with improper ioctl. How do I get fd of an actual terminal when being a destination of a pipe?
>Solution :
Usually, /dev/tty is the current console, and if you don’t need stdio interfaces, you can open it, receiving a fd, with int ttyfd = open("/dev/tty", O_RDWR). (It’s usually a bad idea to mix Unix I/O and stdio I/O on the same device. But if you really want to, open with FILE* ftty = fopen("/dev/tty", "rw"); and get the fd out of the FILE* with fileno(ftty).)