Sistema Dup2 Chamada em C

Sistema Dup2 Chamada em C
O dup2 () A função do sistema é usada para criar uma cópia de um descritor de arquivo existente. No Linux, existem 3 descritores de arquivo padrão. Eles são:

stdin: Este é o descritor de arquivo de entrada padrão. É usado para obter informações do terminal por padrão. scanf (), getc () funções etc. usa stdin Descritor de arquivo para obter entradas do usuário. O stdin O descritor de arquivo também é representado pelo número 0.

stdout: Este é o descritor de arquivo de saída padrão. É usado para imprimir algo no console/terminal por padrão. O amplamente usado printf () Usos da função stdout Para imprimir a saída desejada no console/terminal. O stdout O descritor de arquivo também é representado pelo número 1.

stderr: Este é o descritor de arquivo de erro padrão. Faz a mesma coisa que o stdout Descritor de arquivo. O stderr O descritor de arquivo é usado para imprimir mensagens de erro no console/terminal. A única diferença é se você usar stderr Descritor de arquivo para imprimir as mensagens de erro e stdout Descritor de arquivo para imprimir saídas normais, então você pode separá -las mais tarde. Por exemplo, você pode redirecionar as mensagens de erro para um arquivo e saídas normais para o console ou outro arquivo. O stderr O descritor de arquivo também é representado pelo número 2.

Além desses três descritores de arquivos, você pode criar descritores de arquivos adicionais em C. Para criar um novo descritor de arquivo, você pode usar o abrir() função em c. O abrir() A função abre um novo arquivo, cria um descritor de arquivo para esse arquivo e anexa um número que não seja 0, 1, 2 para o descritor de arquivo.

Depois de abrir um arquivo usando abrir() função, você pode usar o ler() e escrever() função para ler e escrever no descritor de arquivos recém -criado.

Agora, imagine uma situação em que você deseja ler de um arquivo específico usando scanf () ou getc () função e escreva em outro arquivo usando printf () função. Este não é o comportamento padrão do scanf (), getc () e printf () funções como expliquei anteriormente. Por padrão, scanf () e getc () Usos da função stdin e printf () usos stdout E não há como dizer a essas funções para usar outros descritores de arquivos. Portanto, para alterar esse comportamento padrão, você deve substituir o stdin e stdout Descritores de arquivo com os descritores de arquivo desejados. Isso é o que o dup2 () A função do sistema faz. O dup2 () Função copia um descritor de arquivo para outro descritor de arquivo.

Dup2 () Sintaxe e Valor de Retorno:

A sintaxe de dup2 () função é:

int dup2 (int antic_file_descriptor, int new_file_descriptor);

dup2 () função copia o Old_File_Descriptor no new_file_descriptor. Se o new_file_descriptor já existe, então está fechado automaticamente e depois o Old_File_Descriptor é copiado para isso.

No sucesso, o dup2 () função retorna o novo descritor de arquivo. Se ocorrer um erro, dup2 () retorna -1.

O dup2 () A função é definida no arquivo de cabeçalho unistd.h.

Você deve incluir o cabeçalho unistd.h em seu arquivo de origem C para usar o dup2 () função da seguinte forma:

#incluir

Para mais informações, verifique a página do homem de dup2 () com o seguinte comando:

$ man dup2

Exemplo 1:

Crie um novo arquivo de origem C 01_DUP2.c e digite as seguintes linhas de códigos no arquivo.

#incluir
#incluir
#incluir
#incluir
int main (void)
int número 1, número2, soma;
int input_fds = aberto ("./entrada.txt ", o_rdonly);
if (dup2 (input_fds, stdin_fileno) < 0)
printf ("Não é possível duplicar o descritor de arquivos.");
saída (exit_failure);

scanf (" %d %d", & número1, & número2);
soma = número 1 + número2;
printf (" %d + %d = %d \ n", número1, número2, soma);
return exit_success;

Agora, crie um novo arquivo entrada.TXT no mesmo diretório e digite a seguinte linha.

15 41

O principal objetivo deste programa é ler 2 números inteiros do entrada.TXT arquivo usando scanf () função, adicione -os e imprima a soma.

Primeiro, incluí os arquivos de cabeçalho necessários com as seguintes linhas de códigos.

#incluir
#incluir
#incluir
#incluir

No principal() função, eu defini as variáveis ​​necessárias.

int número 1, número2, soma;

Então, eu abri o arquivo entrada.TXT No modo somente leitura (O_RDONLY) usando o abrir() função e armazenou o descritor de arquivo na variável input_fds.

int input_fds = aberto ("./entrada.txt ", o_rdonly);

Uma vez que eu tenho o descritor de arquivo do entrada.TXT Arquivo, copiei o descritor de arquivo para o descritor de arquivo de entrada padrão Stdin_fileno (0) usando dup2 () função. O descritor de arquivo de entrada.TXT agora é o padrão stdin Descritor de arquivo.

dup2 (input_fds, stdin_fileno)

Eu também poderia escrever o dup2 () função da seguinte maneira. O resultado seria o mesmo. Stdin_fileno mantém o valor 0, qual é o valor do stdin Descritor de arquivo.

dup2 (input_fds, 0)

Eu também verifiquei para dup2 () erros com as seguintes linhas. Se ocorrer um erro, o programa será definido para imprimir uma mensagem de erro e sair.

if (dup2 (input_fds, stdin_fileno) < 0)
printf ("Não é possível duplicar o descritor de arquivos.");
saída (exit_failure);

Então eu usei scanf () Para digitalizar 2 números do entrada.TXT arquivo.

scanf (" %d %d", & número1, & número2);

Em seguida, adicionei os números e imprimi a soma no console/terminal, o padrão stdout.

soma = número 1 + número2;
printf (" %d + %d = %d \ n", número1, número2, soma);

Como você pode ver, obtive a saída esperada depois de executar o programa.

Exemplo 2:

Crie um novo arquivo de origem C 02_DUP2.c e digite as seguintes linhas de códigos no arquivo.

#incluir
#incluir
#incluir
#incluir
#incluir
#incluir
int main (void)
int número 1, número2, soma;
int input_fds = aberto ("./entrada.txt ", o_rdonly);
int output_fds = aberto ("./saída.txt ", o_wronly | o_creat, s_irusr | s_iwusr);
dup2 (input_fds, stdin_fileno);
dup2 (output_fds, stdout_fileno);
scanf (" %d %d", & número1, & número2);
soma = número 1 + número2;
printf (" %d + %d = %d \ n", número1, número2, soma);
return exit_success;

Agora, crie um novo arquivo entrada.TXT no mesmo diretório e digite a seguinte linha.

15 41

Neste programa, eu fiz a mesma coisa que em Exemplo 1. A única diferença é que eu criei um novo arquivo saída.TXT e usou o descritor de arquivo da saída.txt como o padrão stdout Descritor de arquivo usando o dup2 () função. Agora, toda a saída do printf () função será escrita para o saída.TXT arquivo.

Eu criei um novo arquivo e armazenei o descritor de arquivo em output_fds variável.

int output_fds = aberto ("./saída.txt ", o_wronly | o_creat, s_irusr | s_iwusr);

Eu também copiei o descritor de arquivo em output_fds para o descritor de arquivo stdout. Eu usei a constante predefinida Stdout_fileno.

dup2 (output_fds, stdout_fileno);

Stdout_fileno contém o valor 1 (o valor do descritor de arquivo padrão de stdout). Então, eu poderia reescrever a chamada de função dup2 () da seguinte maneira. Isso daria os mesmos resultados.

dup2 (output_fds, 1);

O restante do programa é o mesmo. Como você pode ver, depois de executar o programa, ele não imprime nada no console/terminal.

Mas, o programa criou um novo arquivo saída.TXT arquivo.

Como você pode ver, a saída é gravada no arquivo saída.TXT.

Se você quiser escrever todos os erros (stderr) para outro arquivo, você também pode copiar um descritor de arquivo para stderr Descritor de arquivo da seguinte maneira.

dup2 (error_fds, stderr_fileno);

Então, é assim que você usa o dup2 () Chamada do sistema em C. Obrigado por ler este artigo.