Linux slogan
Visite também: Segurança Linux · BR-Linux.org · Dicas-L · Doode · NoticiasLinux · SoftwareLivre.org · UnderLinux



» Screenshot
Linux: kurumin-emu
Por humbhenri
» Login
Login:
Senha:

Se você ainda não possui uma conta, clique aqui.

Esqueci minha senha


Dica

Utilizando as chamadas de sistema dup() e dup2()
Linux user
Publicado por s0l1d_k3rn3l em 14/01/2010

Login: s0l1d_k3rn3l, 4467 pontos
[ Hits: 3668 ]

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
   Dica Linux recomendada Linux na IPTV do Brasil - difícil caminho
   Dica Linux recomendada Baixando vídeos Youtube no Ubuntu
   Dica Linux recomendada Ubuntu e Windows ao mesmo tempo
   Dica Linux recomendada Instalando o Java e NetBeans IDE no Linux
   Dica Linux recomendada Configurando servidor de SubVersion no Ubuntu

Comentários
Nenhum comentário foi encontrado.

Contribuir com comentário


  
Para executar esta ação você precisa estar logado no site, caso contrário, tudo o que for digitado será perdido.
Responsável pelo site: Fábio Berbert de Paula - Conteúdo distribuído sob licença GNU FDL
Site hospedado por:

Viva o Linux

A maior comunidade Linux da América Latina! Artigos, dicas, tutoriais, fórum, scripts e muito mais. Ideal para quem busca auto-ajuda em Linux.