[OT] C programming question: reopen stdin

Mel Flynn mel.flynn+fbsd.questions at mailing.thruhere.net
Thu Apr 16 20:22:15 UTC 2009


On Thursday 16 April 2009 21:03:52 Tobias Rehbein wrote:
> Am Tue, Apr 14, 2009 at 09:07:26PM +0200 schrieb Mel Flynn:
> > On Tuesday 14 April 2009 20:13:00 Tobias Rehbein wrote:
> > > I'm having a little trouble solving a specific problem in C. I want to
> > > write a filter which reads data from stdin. After reading the user
> > > should be able to interact with the program via stdin.
> >
> > Just open(2) /dev/tty. If tty is invalid, then you don't have to expect a
> > user either.
>
> Thanks for this hint. I tried to implement an example. Good someone take a
> look at it and tell me if I did it right. Well, at least it works...
>
> The code is here:
>
>         http://gist.github.com/95320

It is really much simpler, see below for code:
% cat tty.c | ./tty
1: #include <stdio.h>
1: #include <err.h>
<snip>
Hello!
2: Hello!
quit

(Don't focus on the 80char linebuf, I just know for this example I don't need 
more).

/dev/tty is the "controlling terminal input". Stdin is the standard input, 
which is either the receiving end of a pipe/redirection or the controlling 
terminal in it's absence.

> To avoid further spamming of the freebsd-questions mailing list: Could
> someone point me to a good place to ask C programming questions?

O'Reilly has a few good titles (Practical C programming is a good primer, 
followed by Algorithms with C), other then that, comp.lang.c newsgroup.
-- 
Mel

#include <stdio.h>
#include <err.h>

int main(int argc, char **argv)
{
        FILE *tty;
        char linebuf[80];

        while( fgets(linebuf, sizeof(linebuf), stdin) )
                printf("1: %s", linebuf);

        if( (tty = fopen("/dev/tty", "r")) == NULL )
                errx(0, "Running non-interactively. See ya!");

        while( fgets(linebuf, sizeof(linebuf), tty) )
        {
                if( strcmp(linebuf, "quit\n") == 0 )
                        break;
                printf("2: %s", linebuf);
        }

        return 0;
}




More information about the freebsd-questions mailing list