Принятый ответ является почти правильным, за исключением того, что вы не можете полагаться на PATH_MAX, потому что это
гарантированно не будет определено для POSIX, если система не имеет такого
ограничение.
(из справочной страницы readlink (2))
Кроме того, когда оно определено, оно не всегда представляет «истинный» предел. (См. http://insanecoding.blogspot.fr/2007/11/pathmax-simply-isnt.html)
Справочная страница readlink также позволяет сделать это по символической ссылке:
Использование статического размера буфера может не обеспечить достаточно места для
содержание символической ссылки. Требуемый размер буфера может быть
получается из значения stat.st_size, возвращаемого вызовом lstat (2) в
ссылка. Тем не менее, число байтов, записанных readlink () и read-
Linkat () должен быть проверен, чтобы убедиться, что размер символического
между звонками не увеличивалась ссылка.
Однако в случае / proc / self / exe /, как и для большинства файлов / proc, stat.st_size будет 0. Единственное оставшееся решение, которое я вижу, это изменить размер буфера, пока он не помещается.
Я предлагаю использовать vector<char>
, как указано ниже для этой цели:
std::string get_selfpath()
{
std::vector<char> buf(400);
ssize_t len;
do
{
buf.resize(buf.size() + 100);
len = ::readlink("/proc/self/exe", &(buf[0]), buf.size());
} while (buf.size() == len);
if (len > 0)
{
buf[len] = '\0';
return (std::string(&(buf[0])));
}
/* handle error */
return "";
}