Como obter o diretório do executável em C++

Eu desenvolvi um aplicativo em C++ que pode ser executado a partir de qualquer diretório do sistema (referenciado como “diretório de trabalho” ou “working directory“). Porém, este aplicativo necessita acessar uma base de imagens que é armazenada no mesmo diretório onde reside o executável.  Idealmente, este caminho não deve ser definido como uma constante, já que o executável pode ser instalado em diferentes máquinas, com diferentes estruturas de diretórios.

Dessa forma, independentemente do diretório de trabalho a partir do qual o aplicativo tenha sido iniciado, como determinar o caminho (path) onde reside o executável?

Muitos sugerem que o processamento do argv[0] para obtenção deste path, mas eu averiguei na prática que esta solução não é confiável, pois dependendo do sistema operacional, a implementação da passagem do argv[0] é variável.

No Linux, solucionei este problema utilizando a função readlink para o caminho:

proc/self/exe

Como explicado no manual do Linux (no Terminal, digite: man proc), o proc é um pseudo sistema de arquivos com informação sobre processos do sistema que é utilizado pelo kernel do Linux. Mais especificamente, o caminho “proc/[pid]/exe” é um link simbólico que contém o path do comando executado. Ao substituir o process id (pid) por self, obtém-se o path do executável do próprio processo.

O pedaço de código abaixo exemplifica como o path do executável (varíavel exepath) pode ser obtido como uma string. Uma discussão sobre esta implementação pode ser vista neste link.

char buf[1024];
ssize_t len = readlink("/proc/self/exe", buf, sizeof(buf)-1);
string exepath;
if (len != -1) {
        buf[len] = '';
        exepath=string(buf);
}
else {
        /* handle error condition */
}

Notem porém que esta não é a solução definitiva para este problema, uma vez que diferentes sistemas operacionais provêm diferentes mecanismos de acesso ao path do executável.

A seguinte resposta apresentada no stackoverflow trata de diferentes interfaces para diferentes sistemas operacionais: http://stackoverflow.com/a/1024937/2167844   Vale à pena conferir a discussão!

Anúncios

Deixe seu comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s