Bom, como é o minha primeira dica ao VOL, estarei caprichando para vocês.
Nesta dica ensinarei como usar as chamadas de sistema
dup() e
dup2() para manipulação de descritores de arquivos em C.
Primeiro quero explicar os motivos por quê estou escrevendo esse texto.
Andei pesquisando na internet como essas duas funções funcionam, eu estava precisando muito para resolver um problema meu, então eu pesquisei muito, mas não encontrei um texto que explicasse exatamente como funcionavam, existiam alguns até, porém não eram específicos e de fácil entendimento. Então eu resolvi fazer este dica com cada detalhe para que todos consigam entender.
O que são descritores de arquivos
Descritores de arquivos nada mais são do que um identificador para acessar o arquivo.
Exemplo: quando você faz a seguinte operação em c:
fd = open(file, mode);
A função open retorna o descritor do arquivo em fd, ou seja, retorna o identificador para manipular o arquivo.
Ok, mas s0l1d_k3rn3l, o que isso tem a ver com as chamadas dup() e dup2()?
Calma já chegaremos lá.
Nos sistemas UNIX e
Linux temos os seguintes descritores de arquivos de E/S:
Número | Descritor |
0 | ENTRADA-PADRÃO |
1 | SAÍDA-PADRÃO |
2 | SAÍDA-ERRO |
Ok, deu para entender? Espero que sim.
Espero que tenham entendido o que são descritores de arquivos...
dup() e dup2()
Chegamos a parte principal do texto. Agora vou explicar como usar as chamadas dup() e dup2() para manipular os descritores de arquivos.
Utilizar as chamadas dup() e dup2() para manipular os descritores de arquivos:
Chamada de sistema dup()
Protótipo: int dup(int fd);
A chamada de sistema dup() cria uma duplicata do descritor do arquivo, ela procura encontrar o número mais baixo possível ou seja... Se nós realizarmos a seguinte operação:
dup(1);
Ela duplicará a saída padrão.
A duplicata terá o número 3. Porque o número mais baixo é 3.
Ok, mas o que eu posso fazer com isso?
Muitas coisas... imagine que você terá que fechar a saída padrão para escrever em um arquivo, e depois restaurar a situação anterior? muito fácil.
Chamada de sistema dup2()
Protótipo: int dup2(int fd, int fd2);
A chamada de sistema dup2() apaga o antigo descritor(fd2) e insere o novo descritor(fd);
Exemplo: se você está na seguinte situação, eu tenho que fazer dois processos se comunicarem o pai e o filho usando a chamada de sistema pipe().
Você apaga o antigo descritor de saída padrão do filho e redireciona para a saída do pipe.
Quando terminar a operação você volta ao processo pai, restaura o descritor de arquivo de saída padrão e redireciona a entrada padrão para o pai, usando a dup2() novamente.
Outra situação seria quando você tivesse que redirecionar todos os descritores para um único descritor, muito fácil.
Bom pessoal,
Espero que tenham gostado.
Abraço!
Nenhum comentário foi encontrado.