freopen

H

Hlk.Turk

Hi All,

I have a question regarding the standard C library.

Is it possible to have one process (program) that
redirects its stdin to a file, and have a second program
use that file write/append to that file. The first program
will then read its redirected standard input file and
process that...

The first program is like this:

#include <stdio.h>
#include <string.h>

void main (void)
{
FILE *f_stdin = NULL;
char buf [501];

f_stdin = freopen ("stdin", "a+", stdin);
if (f_stdin != NULL)
{
buf[0] = '\0';
while (1)
{
fgets (buf, 500, f_stdin);
if (strlen (buf) > 0)
printf ("buf: %s\n", buf);
if (strcmp (buf, "q") == 0)
break;
buf[0] = '\0';
}
}
else
{
perror ("error(first prog)");
}
}

The second program is:

#include <stdio.h>

void main (void)
{
FILE *f_stdin = NULL;

f_stdin = fopen ("stdin", "a+");
if (f_stdin != NULL)
{
fputs ("a test", f_stdin);
}
else
{
perror ("error(second prog)");
}
}

The code below (creating two executables) compiles.
I can redirect stdin in the first program and can open
and write in the second program. Altough the string is
written to the file, I can not read that from the first
program.

Can you see anything wrong in the above code? Is the
freopen usage correct? Can freopen be used to
redirect std streams to files and have other processes
write to these files and command the first proces?

Regards,
ht
 
B

Ben Bacarisse

Hi All,

I have a question regarding the standard C library.

Is it possible to have one process (program) that
redirects its stdin to a file, and have a second program
use that file write/append to that file. The first program
will then read its redirected standard input file and
process that...

With a following wind and lot fiddling you can get this sort of thing
to work on some platforms. However, what you are doing -- a pair of
programs connected by a buffer -- is so common that there are loads of
way to do it properly. The best way to do it will depend on how
portable you want your solution to be.

Ultimately you will have to go and ask in a group that deals with the
kind of systems that you want this to work on. Standard C (the topic
here) can do little more than read and write streams.

Can you see anything wrong in the above code? Is the
freopen usage correct? Can freopen be used to
redirect std streams to files and have other processes
write to these files and command the first proces?

The freopen is a red herring. The program could just as well use
fopen. On some system, you don't need a file at all -- the output of
one can be "plugged" into the input of the other.
 
S

SM Ryan

(e-mail address removed) wrote:

# Is it possible to have one process (program) that
# redirects its stdin to a file, and have a second program
# use that file write/append to that file. The first program
# will then read its redirected standard input file and
# process that...

As a counterexample, it will probably not work the way you expect
on Unix. If you open read a plain disk file, the kernel does not
change the behavior if there are writers - either you get data
that is currently in the file, or you get an EOF. You don't get
paused while other writers catch up. (There are other types of
files that this will work on in Unix, but these types of files
are not available on all other systems.)

Perhaps your stdio will let read past an EOF so you can keep
trying to see if the file has been extended. (The underlying
Unix I/O permits this, allowing commands like tail -f.) But I
think this is system dependent behaviour.

On Unix freopn to stderr is irrelevant to this: it's a property
of the files themselves not the FILE* connected to them.
 
K

Kevin Handy

Hi All,

I have a question regarding the standard C library.

Is it possible to have one process (program) that
redirects its stdin to a file, and have a second program
use that file write/append to that file. The first program
will then read its redirected standard input file and
process that...

Success in this manner is very dependent on which
OS you are using. You should direct this question
to the proper developer newsgroup for that OS.

Under the various *nix OS's, you may have a 'mkfifo'
or similar command (try 'man mkfifo'). This is almost
exactly what you want.

However, under *nix, you usually get this behavior
simply by doing 'prog1 | prog2' at the command line.
No programming required. The MS-DOS command shell
does a half-hearted emulation of this.

Under other OS's, you may or may not have similar
functionality, just under a different name.

....
 
H

Hlk.Turk

Hi All,

I have a question regarding the standard C library.

Is it possible to have one process (program) that
redirects its stdin to a file, and have a second program
use that file write/append to that file. The first program
will then read its redirected standard input file and
process that...

The first program is like this:

#include <stdio.h>
#include <string.h>

void main (void)
{
FILE *f_stdin = NULL;
char buf [501];

f_stdin =freopen("stdin", "a+", stdin);
if (f_stdin != NULL)
{
buf[0] = '\0';
while (1)
{
fgets (buf, 500, f_stdin);
if (strlen (buf) > 0)
printf ("buf: %s\n", buf);
if (strcmp (buf, "q") == 0)
break;
buf[0] = '\0';
}
}
else
{
perror ("error(first prog)");
}

}

The second program is:

#include <stdio.h>

void main (void)
{
FILE *f_stdin = NULL;

f_stdin = fopen ("stdin", "a+");
if (f_stdin != NULL)
{
fputs ("a test", f_stdin);
}
else
{
perror ("error(second prog)");
}

}

The code below (creating two executables) compiles.
I can redirect stdin in the first program and can open
and write in the second program. Altough the string is
written to the file, I can not read that from the first
program.

Can you see anything wrong in the above code? Is thefreopenusage correct? Canfreopenbe used to
redirect std streams to files and have other processes
write to these files and command the first proces?

Regards,
ht

Thank you all for the responses.

ht
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Similar Threads

Can't solve problems! please Help 0
A process take input from /proc/<pid>/fd/0, but won't process it 0
error 28
Adding adressing of IPv6 to program 1
write error 13
getline problem 10
epoll networking code review 4
code 34

Members online

Forum statistics

Threads
473,961
Messages
2,570,130
Members
46,689
Latest member
liammiller

Latest Threads

Top