dup (wywołanie systemowe) - dup (system call)

W uniksowych systemach operacyjnych, dup (skrót od „duplikat”) i dup2 wywołania systemowe utworzyć kopię danego deskryptora pliku . Ten nowy deskryptor rzeczywiście nie zachowuje się jak kopią, ale jak to alias w starej.

C definicja POSIX biblioteki

DUP i dup2 połączenia są standaryzowane przez POSIX specyfikacji.

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

Były przydziela pierwszy dostępny deskryptor, podobnie jak open () zachowuje; alternatywny sposób powielić deskryptora pliku do nieokreślonym miejscu jest fcntl wywołanie systemowe z F_DUPFDpoleceniem.

Te ostatnie umieszcza skopiuj do newfd. Jeśli newfd jest otwarty, jest on zamknięty w pierwszej kolejności.

dup2 dla wejścia / wyjścia przekierowania

Muszle Unix używać dup2 dla wejścia / wyjścia przekierowania . Wraz z pipe(), jest to narzędzie, w którym rury Unix polegać.

W następującym przykładzie pipe(), a dup()w celu połączenia dwóch oddzielnych procesów ( program1 i program2 ) za pomocą rury Unix :

#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);
}

Zobacz też

Referencje