Во-первых, я хотел бы прокомментировать ваше решение для Linux: оно примерно в 5 раз дольше, чем нужно, и выполняет много совершенно ненужных операций, а также использует магическое число 1024, которое просто неправильно :
$ grep PATH_MAX /usr/include/linux/limits.h
#define PATH_MAX 4096 /* # chars in a path name */
Вот правильная минимальная замена:
#include <limits.h>
...
char exepath[PATH_MAX] = {0};
readlink("/proc/self/exe", exepath, sizeof(exepath));
Во-вторых, в HP-UX вы можете использовать shl_get_r()
для получения информации обо всех загруженных модулях. В индексе 0 вы найдете информацию об основном исполняемом файле. desc.filename
будет указывать на имя исполняемого файла во время execve(2)
.
К сожалению, это имя относительное, поэтому вам, возможно, придется поискать $PATH
, и оно может завершиться ошибкой, если приложение выполнило putenv("PATH=some:new:path")
или если исходное имя было, например, ./a.out
и приложение выполнило chdir(2)
с тех пор.