Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 16 Apr 2009 22:22:06 +0200
From:      Mel Flynn <mel.flynn+fbsd.questions@mailing.thruhere.net>
To:        freebsd-questions@freebsd.org
Cc:        Tobias Rehbein <tobias.rehbein@web.de>
Subject:   Re: [OT] C programming question: reopen stdin
Message-ID:  <200904162222.06680.mel.flynn%2Bfbsd.questions@mailing.thruhere.net>
In-Reply-To: <20090416190352.GA5366@sushi.pseudo.local>
References:  <20090414181300.GA3813@sushi.pseudo.local> <200904142107.26678.mel.flynn%2Bfbsd.questions@mailing.thruhere.net> <20090416190352.GA5366@sushi.pseudo.local>

next in thread | previous in thread | raw e-mail | index | archive | help
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;
}





Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200904162222.06680.mel.flynn%2Bfbsd.questions>