Programação C

dup2 chamada de sistema em C

dup2 chamada de sistema 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 receber entrada do terminal por padrão. scanf (), getc () etc funções usam Stdin descritor de arquivo para obter as entradas do usuário. O Stdin 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 utilizado printf () função usa stdout para imprimir a saída desejada no console / terminal. O stdout descritor de arquivo também é representado pelo número 1.

stderr: Este é o descritor de arquivo de erro padrão. Ele 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á-los mais tarde. Por exemplo, você pode redirecionar as mensagens de erro para um arquivo e as saídas normais para o console ou outro arquivo. O stderr descritor de arquivo também é representado pelo número 2.

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

Depois de abrir um arquivo usando abrir() função, você pode usar o leitura() e Escreva() função para ler e gravar no descritor de arquivo 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 gravar 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 () função usa Stdin e printf () usa stdout e não há como dizer a essas funções para usar outros descritores de arquivo. Portanto, para alterar este comportamento padrão, você deve substituir o Stdin e stdout descritores de arquivo com seus descritores de arquivo desejados. Isso é o que dup2 () função do sistema faz. O dup2 () função copia um descritor de arquivo para outro descritor de arquivo.

Sintaxe dup2 () e valor de retorno:

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

int dup2 (int old_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 é fechado automaticamente e então o old_file_descriptor é copiado para isso.

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

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

Você deve incluir o cabeçalho unistd.h em seu arquivo de origem C, a fim de usar o dup2 () funcionar da seguinte forma:

#incluir

Para obter mais informações, verifique a página do manual do 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úmero1, número2, soma;
 
int input_fds = open ("./entrada.txt ", O_RDONLY);
 
if (dup2 (input_fds, STDIN_FILENO) < 0)
printf ("Incapaz de duplicar o descritor do ficheiro.");
sair (EXIT_FAILURE);

 
scanf ("% d% d", & número1, & número2);
 
soma = numero1 + numero2;
 
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 nele.

15 41

O objetivo principal 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 a Principal() função, eu defini as variáveis ​​necessárias.

int número1, número2, soma;

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

int input_fds = open ("./entrada.txt ", O_RDONLY);

Assim que tiver 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 () funcionar como segue. 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 dup2 () erros com as seguintes linhas. Se ocorrer um erro, o programa é configurado para imprimir uma mensagem de erro e sair.

if (dup2 (input_fds, STDIN_FILENO) < 0)
printf ("Incapaz de duplicar o descritor do ficheiro.");
sair (EXIT_FAILURE);

Então, eu usei scanf () para escanear 2 números do entrada.TXT Arquivo.

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

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

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

Como você pode ver, obtive a saída esperada assim que executei 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úmero1, número2, soma;
int input_fds = open ("./entrada.txt ", O_RDONLY);
int output_fds = open ("./resultado.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 = numero1 + numero2;
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 nele.

15 41

Neste programa, fiz a mesma coisa que em Exemplo 1. A única diferença é que criei um novo arquivo resultado.TXT e usou o descritor de arquivo de 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 resultado.TXT Arquivo.

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

int output_fds = open ("./resultado.txt ", O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR);

Eu também copiei o descritor de arquivo 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. Daria os mesmos resultados.

dup2 (output_fds, 1);

O resto 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 resultado.TXT Arquivo.

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

Se você quiser escrever todos os erros (stderr) para outro arquivo, então você também pode copiar um descritor de arquivo para stderr descritor de arquivo como segue.

dup2 (error_fds, STDERR_FILENO);

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

Como desenvolver um jogo no Linux
Uma década atrás, poucos usuários de Linux preveriam que seu sistema operacional favorito um dia seria uma plataforma de jogos popular para videogames...
Portas de código aberto para motores de jogos comerciais
Recriações gratuitas, de código aberto e de mecanismo de jogo de plataforma cruzada podem ser usadas para jogar jogos antigos, bem como alguns dos tít...
Melhores jogos de linha de comando para Linux
A linha de comando não é apenas sua maior aliada ao usar o Linux - ela também pode ser uma fonte de entretenimento porque você pode usá-la para jogar ...