Utilizando as chamadas de sistema dup() e dup2()

Publicado por s0l1d_k3rn3l em 14/01/2010

[ Hits: 14.216 ]

 


Utilizando as chamadas de sistema dup() e dup2()



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úmeroDescritor
0ENTRADA-PADRÃO
1SAÍDA-PADRÃO
2SAÍ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!

Outras dicas deste autor
Nenhuma dica encontrada.
Leitura recomendada

Segurança no Grub

Java: Lendo a entrada do teclado

Squid + DansGuardian + Webmin no CentOS 6.6

Katapult - Lançador de aplicativos KDE

Alternativas ao MS Paint pra Linux

  

Comentários

Nenhum comentário foi encontrado.



Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts