Tek-Tips is the largest IT community on the Internet today!

Members share and learn making Tek-Tips Forums the best source of peer-reviewed technical information on the Internet!

  • Congratulations Chriss Miller on being selected by the Tek-Tips community for having the most helpful posts in the forums last week. Way to Go!

fork, dup2, and redirection of the stdin/stdout

Status
Not open for further replies.

bobetko

Programmer
Joined
Jan 14, 2003
Messages
155
Location
US
The code below is simply doing shell comand "ls" (as example).
Question is, how can I redirect output to go to the some file instead to stdout?

Code:
int filedesc(){
    int n, fd[2];
    pipe (fd);
    switch (fork()) {
        case -1:
             //error;
        case 0:
         close(fd[0]);
         dup2(fd[1], STDOUT_FILENO);
         close(fd[1]);
         execlp("ls", "ls", NULL);
   }
}

I tried to open file using "I/O low level open" (for writting) and to use its file descriptor to make redirection
like this:

Code:
int filedesc(){
    int n, fd[2];
    pipe (fd);
    switch (fork()) {
        case -1:
             //error;
        case 0:
         close(fd[0]);
         dup2(fd[1], fdout);  //my file descriptor
         close(fd[1]);
         execlp("ls", "ls", NULL);
   }
}

Didn't work.

Thanks....
 
If you're redirecting to a file, there is no pipe.
So assuming fdout is what you got from doing say
Code:
fdout = open("file.txt",O_WRONLY);

Then it would be
Code:
         dup2(fdout, STDOUT_FILENO);
         close(fdout);
         execlp("ls", "ls", NULL);

--
 
Thanks for your help again. I tried as you said and all I get is empty "file.txt". I guess execlp need to know somehow where to redirect its output? how?

Code:
int test(){
    fdout = open("file.txt",O_WRONLY | O_CREAT, 0600);
    switch (fork()) {
        case -1:
             //error;
        case 0:
          dup2(fdout, STDOUT_FILENO);
          close(fdout);
          execlp("ls", "ls", NULL);
   }
}

Thanks
 
*shrug*
No idea - works for me, I get a file with the expected contents.
Code:
$ cat bar.c && gcc bar.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int test(){
    int fdout = open("file.txt",O_WRONLY | O_CREAT, 0600);
    switch (fork()) {
      case -1:
             //error;
      case 0:
        dup2(fdout, STDOUT_FILENO);
        close(fdout);
        execlp("ls", "ls", NULL);
    }
}

int main (void) {
  test();
  return 0;
}

$ ./a.out && wc file.txt
 47  47 436 file.txt

Check the return result from open() to make sure you actually got a valid file descriptor.

--
 
You're right.
I mispelled file descriptor's name. (and that mispelled name was already declared as an integer)... It took me some time to figure it out.... thanks Salem
 
I came across an interesting issue related to this.

I have a C program which opens a log file, then dups the file descriptor to stderr (fd 2) and closes the original fd. I then can call fprintf(stderr,....); to write to the log file.

On Solaris and Red Hat, this works fine. However, when I attempted to port this code to Windows, it didn't work.
 
Status
Not open for further replies.

Part and Inventory Search

Sponsor

Back
Top