AIX open (): descritor de arquivo é zero (!?)

2

Um processo daemon, ao detectar a presença de um arquivo de texto em um determinado diretório, lança um arquivo executável que abre o arquivo de texto mencionado acima para ler e transmitir seus dados através de um soquete TCP.

O número do descritor de arquivo do arquivo de texto aberto é registrado junto com outras informações sobre o processamento do arquivo.

Foi notado que, de tempos em tempos, o descritor de arquivo retornado pela chamada open () é zero (normalmente isso é reservado para stdin). Nenhum erro é detectado e tudo funciona bem. O código-fonte em C não faz mais nada que open () e depois close () - não há redirecionamento, duplicação ou qualquer outra feitiçaria executada no identificador de arquivo retornado.

Em que circunstâncias poderia um descritor de arquivo 0 estar disponível para uso geral (e não atribuído a stdin)?

Plataforma é o AIX 5.2.

    
por Wheelnut 09.11.2013 / 22:37

2 respostas

0

Under what circumstances could a process's file descriptor 0 be available for general use (and not attributed to stdin)

Quando alguém fechou stdin, por ex. com <&- do shell.

#include <stdio.h>
#include <sys/stat.h>
#include <fcntl.h>
int main() {
    printf("%d\n",open("foo",O_CREAT));
}
    
por 10.11.2013 / 00:05
1

A chamada do sistema open normalmente retorna o descritor de arquivo mais baixo que ainda não está em uso. Para programas típicos, os arquivos abertos começam em 3 porque os descritores de arquivo 0, 1 e 2 são usados para os descritores padrão pré-abertos (entrada, saída e erro). O daemon nunca lerá nenhuma entrada ou produzirá qualquer saída, portanto, eles normalmente fecham os descritores de arquivo 0 e 1 ou reabriam /dev/null lá. Se o daemon fechar o descritor de arquivos 0, o próximo arquivo que abrir será nesse descritor. Não há nada de errado com isso.

O descritor de arquivo 0 não é realmente “atribuído a stdin” - em vez disso, ele é stdin por definição de stdin. Ambientes normais de execução têm o descritor de arquivo 0 aberto para entrada, mas um programa que não lê nenhuma entrada está livre para usar esse descritor para qualquer propósito que queira.

    
por 10.11.2013 / 21:15