dup (chamada de sistema) - dup (system call)

Em Unix-like sistemas operacionais, dup (abreviação de "duplicar") e dup2 chamadas de sistema criar uma cópia de um determinado descritor de arquivo . Este novo descritor realmente não se comporta como uma cópia, mas como um apelido do antigo.

C definição da biblioteca POSIX

As chamadas dup e dup2 são padronizados pela POSIX especificação.

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

O ex-aloca o primeiro descritor disponíveis, assim como open () se comporta; uma forma alternativa para duplicar um descritor de arquivo para um lugar não especificado é o fcntl chamada de sistema com F_DUPFDcomando.

Os últimos lugares a cópia em newfd. Se newfd é aberto, ele é fechado em primeiro lugar.

dup2 para redirecionamento de entrada / saída

Conchas Unix usar dup2 para entrada / saída de redirecionamento . Junto com pipe(), é uma ferramenta em que pipes Unix confiar.

O exemplo que se segue utiliza pipe()e dup()a fim de ligar dois processos separados ( Program1 e Program2 ), utilizando tubos de 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);
}

Veja também

Referências