dup (system call)

In Unix-like operating systems, dup (short for "duplicate") and dup2 system calls create a copy of a given file descriptor. This new descriptor actually does not behave like a copy, but like an alias of the old one.

C library POSIX definition

The dup and dup2 calls are standardized by the POSIX specification.[1]

int dup (int oldfd);
int dup2 (int oldfd, int newfd);

The former allocates the first available descriptor, just like open() behaves; an alternative way to duplicate a file descriptor to an unspecified place is the fcntl system call with F_DUPFD command.

The latter places the copy into newfd. If newfd is open, it is closed first.

dup2 for input/output redirection

Unix shells use dup2 for input/output redirection. Along with pipe(), it is a tool on which Unix pipes rely.

The following example uses pipe() and dup() in order to connect two separate processes (program1 and program2) using Unix pipes:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

/* function prototypes */
void die(const char*);
 
int main(int argc, char **argv) {
	int pdes[2];
	pid_t child;
 
	if(pipe(pdes) == -1)
		die("pipe()");
 
	child = fork();
	if(child == (pid_t)(-1))
        	die("fork()"); /* fork failed */
 
	if(child == (pid_t)0) {
        	/* child process */

        	close(1);       /* close stdout */
        	
        	if(dup(pdes[1]) == -1)
        		die("dup()");
        	
        	/* now stdout and pdes[1] are equivalent (dup returns lowest free descriptor) */

        	if((execlp("program1", "program1", "arg1", NULL)) == -1)
        		die("execlp()");

		_exit(EXIT_SUCCESS);
	} else {
        	/* parent process */

        	close(0);       /* close stdin */
        	
        	if(dup(pdes[0]) == -1)
        		die("dup()");

        	/* now stdin and pdes[0] are equivalent (dup returns lowest free descriptor) */

        	if((execlp("program2", "program2", "arg1", NULL)) == -1)
        		die("execlp()");

		exit(EXIT_SUCCESS);
	}
 
	return 0;
}

void die(const char *msg) {
	perror(msg);
	exit(EXIT_FAILURE);
}
gollark: No.
gollark: Not just occasional "team building days" or something.
gollark: I think the "random facts about taxes and whatever" life skills should be learned independently and the vague general stuff like "working in teams" would be best learned through actually doing it seriously.
gollark: I would of course replace the English lesson badness with bringing arbitrary books in to read yourself.
gollark: School but instead of reading random poems you memorise 'life skills' would be quite ae ae ae, as they say.

See also

References

  1. "dup, dup2". opengroup.org.
  • Advanced Programming in the UNIX Environment by W. Richard Stevens ISBN 81-7808-096-6
This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.