CS 702 - Operating Systems - Fall 2004
dup2
Loyola College >
Department of Computer Science >
Dr. James Glenn >
CS 702 >
Examples and Lecture Notes >
dup2
ezredirect.c
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
/**
* Executes the command "grep Villanova < scores > out".
*
* @author Jim Glenn
* @version 0.1 9/23/2004
*/
int main(int argc, char **argv)
{
int in, out;
char *grep_args[] = {"grep", "Villanova", NULL};
// open input and output files
in = open("scores", O_RDONLY);
out = open("out", O_WRONLY | O_TRUNC | O_CREAT, S_IRUSR | S_IRGRP | S_IWGRP | S_IWUSR);
// replace standard input with input file
dup2(in, 0);
// replace standard output with output file
dup2(out, 1);
// close unused file descriptors
close(in);
close(out);
// execute grep
execvp("grep", grep_args);
}
pipe.c
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
/**
* Executes the command "cat scores | grep Villanova". In this quick-and-dirty
* implementation the parent doesn't wait for the child to finish and
* so the command prompt may reappear before the child terminates.
*
* @author Jim Glenn
* @version 0.1 9/23/2004
*/
int main(int argc, char **argv)
{
int pipefd[2];
int pid;
char *cat_args[] = {"cat", "scores", NULL};
char *grep_args[] = {"grep", "Villanova", NULL};
// make a pipe (fds go in pipefd[0] and pipefd[1])
pipe(pipefd);
pid = fork();
if (pid == 0)
{
// child gets here and handles "grep Villanova"
// replace standard input with input part of pipe
dup2(pipefd[0], 0);
// close unused hald of pipe
close(pipefd[1]);
// execute grep
execvp("grep", grep_args);
}
else
{
// parent gets here and handles "cat scores"
// replace standard output with output part of pipe
dup2(pipefd[1], 1);
// close unused unput half of pipe
close(pipefd[0]);
// execute cat
execvp("cat", cat_args);
}
}
This code can also be downloaded from the files
ezredirect.c,
and pipe.c.