logo

dup() e dup2() chamada de sistema Linux

dup()

A chamada de sistema dup() cria uma cópia de um descritor de arquivo.

  • Ele usa o descritor não utilizado de numeração mais baixa para o novo descritor.
  • Se a cópia for criada com sucesso, os descritores de arquivo original e de cópia poderão ser usados ​​de forma intercambiável.
  • Ambos se referem à mesma descrição de arquivo aberto e, portanto, compartilham sinalizadores de deslocamento e status do arquivo.

Sintaxe:



    int dup(int oldfd);     
oldfd: old file descriptor whose copy is to be created.
C
// C program to illustrate dup()  #include #include  #include  int main() {  // open() returns a file descriptor file_desc to a   // the file 'dup.txt' here'  int file_desc = open('dup.txt' O_WRONLY | O_APPEND);    if(file_desc < 0)  printf('Error opening the filen');    // dup() will create the copy of file_desc as the copy_desc  // then both can be used interchangeably.  int copy_desc = dup(file_desc);    // write() will write the given string into the file  // referred by the file descriptors  write(copy_desc'This will be output to the file named dup.txtn' 46);    write(file_desc'This will also be output to the file named dup.txtn' 51);    return 0; } 

Observe que este programa não será executado no compilador online, pois inclui abrir um arquivo e escrever nele.

Explicação:

O open() retorna um descritor de arquivo file_desc para o arquivo chamado 'dup.txt'. file_desc pode ser usado para realizar alguma operação de arquivo com o arquivo 'dup.txt'. Depois de usar a chamada de sistema dup(), uma cópia de file_desc é criada copy_desc. Esta cópia também pode ser usada para realizar alguma operação de arquivo com o mesmo arquivo 'dup.txt'. Após duas operações de gravação, uma com file_desc e outra com copy_desc, o mesmo arquivo é editado, ou seja, 'dup.txt'. Antes de executar o código, deixe o arquivo 'dup.txt' antes da operação de gravação conforme mostrado abaixo:

dup() e dup2() chamada de sistema Linux

Após executar o programa C mostrado acima, o arquivo 'dup.txt' fica conforme mostrado abaixo:

dup() e dup2() chamada de sistema Linux

dup2()

A chamada de sistema dup2() é semelhante a dup() mas a diferença básica entre elas é que em vez de usar o descritor de arquivo não utilizado de número mais baixo, ele usa o número do descritor especificado pelo usuário.

Sintaxe:

int dup2(int oldfd int newfd);  
oldfd: old file descriptor
newfd new file descriptor which is used by dup2() to create a copy.

Pontos importantes:

  • Inclua o arquivo de cabeçalho unistd.h para usar a chamada de sistema dup() e dup2().
  • Se o descritor newfd foi aberto anteriormente, ele será fechado silenciosamente antes de ser reutilizado.
  • Se oldfd não for um descritor de arquivo válido, a chamada falhará e newfd não será fechado.
  • Se oldfd for um descritor de arquivo válido e newfd tiver o mesmo valor que oldfd então dup2() não faz nada e retorna newfd.

Um uso complicado da chamada de sistema dup2():

Como em dup2() no lugar de newfd qualquer descritor de arquivo pode ser colocado. Abaixo está uma implementação C na qual o descritor de arquivo de saída padrão (stdout) é usado. Isso fará com que todas as instruções printf() sejam escritas no arquivo referido pelo descritor de arquivo antigo.

C
// C program to illustrate dup2()  #include #include #include #include int main() {  int file_desc = open('tricky.txt'O_WRONLY | O_APPEND);    // here the newfd is the file descriptor of stdout (i.e. 1)  dup2(file_desc 1) ;     // All the printf statements will be written in the file  // 'tricky.txt'  printf('I will be printed in the file tricky.txtn');   return 0; } 

Isso pode ser visto na figura abaixo: Deixe o arquivo 'tricky.txt' antes da operação dup2() ser conforme mostrado abaixo:

dup() e dup2() chamada de sistema Linux

Depois de executar o programa C mostrado acima, o arquivo 'tricky.txt' fica conforme mostrado abaixo:

dup() e dup2() chamada de sistema Linux Criar questionário