Existe um nome de caminho POSIX que não pode nomear um arquivo?

4

Existe algum caminho legal no POSIX que não pode ser associado a um arquivo, regular ou irregular? Ou seja, para qual test -e "$LEGITIMATEPOSIXPATHNAME" não pode ter sucesso?

Esclarecimento # 1: nomes de caminho

Por "caminhos legais no POSIX", quero dizer aqueles que o POSIX diz que são permitidos, não aqueles que o POSIX não proíbe explicitamente. Eu procurei isso, e a especificação POSIX chama-os de seqüências de caracteres que:

  1. Use somente caracteres do conjunto de caracteres de nome de arquivo portátil [a-zA-Z0-9._-] (cf. link );
  2. Não comece com - ; e
  3. Tem tamanho entre 1 e NAME_MAX, um número não especificado para POSIX que não é menor que 14.

O POSIX também permite que sistemas de arquivos sejam mais relaxados do que isso, mas proíbe que os caracteres NUL e / apareçam em nomes de arquivos. Note que um nome de arquivo UNIX paradigmaticamente como lost+found não é FPF, de acordo com este def. Há outra PATH_MAX constante, cujo uso não precisa de mais explicações.

A resposta ideal usará FPFs, mas estou interessado em qualquer exemplo com nomes de arquivos que POSIX não proíba expressamente.

Esclarecimento # 2: impossibilidade

Obviamente, nomes de caminhos normalmente podem ser ligados a um arquivo. Mas a semântica do UNIX informará que há lugares especiais que normalmente não poderiam ter arquivos arbitrários criados, como no diretório /dev . Há algum desses lugares especiais estipulados no POSIX? É isso que a questão está ficando depois.

    
por Charles Stewart 14.01.2010 / 12:59

5 respostas

3

Como a pergunta final é se existem locais especiais que normalmente não poderiam ter um arquivo, como no diretório / dev estipulado no POSIX, então o andswer é YES .

A lista completa de arquivos e diretórios pré-determinados é dada no capítulo 10, Estrutura de Diretório e Dispositivos POSIX , da Especificações da Base do Grupo Aberto do IEEE, Edição 6 :

The following directories shall exist on conforming systems and conforming applications shall make use of them only as described. Strictly conforming applications shall not assume the ability to create files in any of these directories, unless specified below.

/
The root directory.
/dev
Contains /dev/console, /dev/null, and /dev/tty, described below.

The following directory shall exist on conforming systems and shall be used as described:

/tmp
A directory made available for applications that need a place to create temporary files. Applications shall be allowed to create files in this directory, but shall not assume that such files are preserved between invocations of the application.

The following files shall exist on conforming systems and shall be both readable and writable:

/dev/null
An infinite data source and data sink. Data written to /dev/null shall be discarded. Reads from /dev/null shall always return end-of-file (EOF).
/dev/tty
In each process, a synonym for the controlling terminal associated with the process group of that process, if any. It is useful for programs or shell procedures that wish to be sure of writing messages to or reading data from the terminal no matter how output has been redirected. It can also be used for applications that demand the name of a file for output, when typed output is desired and it is tiresome to find out what terminal is currently in use.

The following file shall exist on conforming systems and need not be readable or writable:

/dev/console
The /dev/console file is a generic name given to the system console (see System Console). It is usually linked to an implementation-defined special file. It shall provide an interface to the system console conforming to the requirements of the Base Definitions volume of IEEE Std 1003.1-2001, Chapter 11, General Terminal Interface.

    
por 21.01.2010 / 20:26
3

O teste de um nome de arquivo com o caractere nulo deve sempre falhar.

POSIX reserva '/' e nulo de nomes de arquivos. Isso é sensato: um é o separador de diretório e um é um terminador de cadeia. Para suportar esse ponto, a Wikipedia diz que ext2, ext3 e ext4 permitem todos os bytes em nomes de arquivos, exceto null e a barra. O NTFS, esteja ou não no modo de compatibilidade POSIX, não permite mais que isso; e variantes FAT também não permitem null. Em teoria, isso realmente depende do sistema de arquivos. Mas eu não prenderei a respiração tentando encontrar um caso em que null encontre seu caminho em um nome de arquivo.

    
por 18.01.2010 / 12:21
2

/dev/null/impossible não pode existir. Isso ocorre porque /dev/null deve ser um arquivo e, portanto, não pode ser um diretório.

O mesmo que para /dev/tty/impossible e /dev/console/impossible

    
por 16.11.2013 / 06:38
1

"Caminho jurídico no POSIX" já significa que ele pode apontar para um objeto do sistema de arquivos (arquivo, diretório, link simbólico, etc.).

Pensando duas vezes, alguns sistemas de arquivos (como o FAT) têm restrições quanto a caracteres permitidos em nomes de arquivos. Portanto, no meu computador, ~/fs/phone/This:is*a?file|name.txt seria rejeitado pelo driver do sistema de arquivos vfat .

Para responder à segunda pergunta, test -e "$LEGITIMATEPOSIXPATHNAME" falha quando o arquivo não existe, obviamente.

    
por 14.01.2010 / 15:04
0

O teste falharia se o nome do arquivo quebra as limitações da implementação local do POSIX.

Todo file-system existente faz suposições quanto a comprimentos máximos, limites de recursão de diretórios e mais. Portanto, um nome POSIX legal em um sistema operacional pode não ser legal em outro.

Então, minha resposta para a pergunta é "Sim":
Mesmo nomes que são legais quando testados em um sistema POSIX, podem ser rejeitados por outro, devido a restrições de implementação.

    
por 18.01.2010 / 14:23