Com qual arquivo de cabeçalho devo invocar #include
para poder usar PATH_MAX como um int para dimensionar uma string?
Eu quero ser capaz de declarar:
char *current_path[PATH_MAX];
Mas, quando faço isso, meu compilador (Clang / LLVM no Linux) emite o seguinte erro:
recursive_find6.c:29:20: error: use of undeclared identifier 'PATH_MAX'
char *current_path[PATH_MAX];
^
Tentei fazer uma pesquisa no Google, mas ainda sem sorte.
#include <limits.h>
NÃO corrige o problema / erro.
Também estou correto que o valor de PATH_MAX é um int?
char current_path[PATH_MAX];
vez dechar *current_path[PATH_MAX];
- você quer uma string em vez de uma matriz de ponteiros.Respostas:
Está dentro
linux/limits.h
.#define PATH_MAX 4096 /* # chars in a path name including nul */
PATH_MAX
tem algumas falhas conforme mencionado neste blog (obrigado paulsm4)fonte
<limits.h>
diz: Uma definição de uma das constantes simbólicas na lista a seguir deve ser omitida do<limits.h>
cabeçalho [...] onde o valor correspondente é igual ou maior que o mínimo declarado, mas onde o valor pode variar dependendo do arquivo ao qual é aplicado. O valor real suportado para um nome de caminho específico deve ser fornecido pela função pathconf ().Esteja ciente de que ainda não está claro se
PATH_MAX
define um comprimento máximo com ou sem um byte nul final. Pode ser um ou outro em diferentes sistemas operacionais. Se você não pode ou não quer verificar em que caso está durante a compilação, é mais seguro forçar o limite artificial dePATH_MAX - 1
. Melhor prevenir do que remediar. (Obviamente, você ainda precisa reservar pelo menosPATH_MAX
bytes de memória para armazenar a string.)fonte
{PATH_MAX}
Número máximo de bytes em um nome de caminho, incluindo o caractere nulo de terminação. De POSIX '01.<limits.h>
(Justificativa): {PATH_MAX} IEEE PASC Interpretation 1003.1 # 15 abordou a inconsistência no padrão com a definição do caminho e a descrição de {PATH_MAX}, permitindo que os desenvolvedores de aplicativos aloquem {PATH_MAX} ou {PATH_MAX} +1 bytes. A inconsistência foi removida pela correção da definição {PATH_MAX} para incluir o caractere nulo. Com essa mudança, os aplicativos que alocaram bytes de {PATH_MAX} continuarão a ter sucesso.PATH_MAX - 1
, masPATH_MAX + 1
. Você não precisa mais disso, mas deseja adicionar um byte para o'\0'
.A maneira portátil de fazer isso é:
Especificação: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/limits.h.html
fonte
PATH_MAX
não precisa ser definido: "Uma definição de uma das constantes simbólicas na lista a seguir deve ser omitida do<limits.h>
cabeçalho em implementações específicas onde o valor correspondente é igual ou maior que o mínimo estabelecido, mas onde o valor pode variar dependendo no arquivo ao qual é aplicado. O valor real suportado para um nome de caminho específico deve ser fornecido pelapathconf()
função. " Dado que os sistemas de arquivos do Linux suportam valores diferentes, é provavelmente uma violação do padrão POSIX para Linux definirPATH_MAX
.Ao fazer programação C simples, encontrei o mesmo desafio. Em seu sistema Linux particular, o diretório / usr / include contém muitos, aqui arquivos de cabeçalho específicos para um sistema operacional Linux.
Você deve ver vários cabeçalhos definindo PATH_MAX; infelizmente, esse valor foi definido de forma diferente em cabeçalhos diferentes. Aqui está uma lista do meu Ubuntu (também removi manualmente alguns resultados falsos positivos do programa grep).
O cabeçalho /linux/limits.h teve o maior número e deve ser o mais autêntico a ser incluído. A estratégia alternativa é definir o seu próprio com um nome diferente, digamos PATHLEN (4080 é longo o suficiente para a maioria das situações práticas). Meu ponto principal é aprender a usar find para procurar respostas para suas perguntas.
fonte
PATH_MAX é um limite do sistema. Existem três categorias sobre os limites do sistema existentes no ambiente POSIX. Uma dessas categorias é Pathname Variable Values . Os limites do sistema que dependem do sistema de arquivos se enquadram nesta categoria. PATHMAX também é um valor de variável de nome de caminho. (portanto, este valor pode mudar de sistema de arquivo para sistema de arquivo.) Portanto, o limite de PATHNAME pode ser obtido com as funções POSIX pathconf () / fpathconf () . Esta é uma maneira portátil de obter o limite do PATHNAME de um sistema de arquivos específico. O código de exemplo é o seguinte:
fonte