[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