dup (systemopkald) - dup (system call)

I Unix-lignende operativsystemer opretter dup (forkortelse af "duplikat") og dup2- systemopkald en kopi af en given filbeskrivelse . Denne nye deskriptor opfører sig faktisk ikke som en kopi, men som et alias fra den gamle.

C-bibliotek POSIX-definition

Dup- og dup2-opkaldene er standardiseret efter POSIX- specifikationen.

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

Førstnævnte tildeler den første tilgængelige deskriptor, ligesom åben () opfører sig; en alternativ måde at kopiere en filbeskrivelse til et uspecificeret sted er fcntl- systemopkaldet med F_DUPFDkommando.

Sidstnævnte placerer kopien i newfd. Hvis newfd er åben, lukkes det først.

dup2 til omdirigering af input / output

Unix-skaller bruger dup2 til input / output omdirigering . Sammen med pipe()er det et værktøj, som Unix-rør bygger på.

Følgende eksempel bruger pipe()og dup()for at forbinde to separate processer ( program1 og program2 ) ved hjælp af Unix-rør :

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

Se også

  • Filbeskrivelse  - hvordan det fungerer og andre funktioner i forbindelse med åben

Referencer