В другом вопросе ответ гласит, что в Unix с /proc
действительно простой и надежный способ - readlink("/proc/self/exe", buf, bufsize)
, а затем он предлагает решения для резервного копирования следующим образом:
В Unixes без / proc (то есть, если вышеперечисленное не работает):
- Если argv [0] начинается с "/" (абсолютный путь), это путь.
- В противном случае, если argv [0] содержит "/" (относительный путь), добавьте его в cwd (при условии, что он еще не был изменен).
getcwd(buf, bufsize); strncat(buf, "/", bufsize-strlen(buf)-1);
strncat(buf, argv[0], bufsize-strlen(buf)-1);
- В противном случае ищите в каталоге
$PATH
исполняемый файл argv[0]
.
После этого может быть целесообразно проверить, не является ли исполняемый файл символической ссылкой. Если это разрешить это относительно каталога символической ссылки.
Теперь в моем случае, к сожалению, ничего из вышеперечисленного не работает:
/proc/self/exe exists
, но не удалось readlink()
из-за отклоненного разрешения errno 13.
- У
argv[0]
нет /
для абсолютного или относительного пути.
-
$PATH
не содержит исполняемый файл, найденный в argv[0]
.
Похоже, с этой проблемой сталкиваются и при запуске приложений sgid. В моем случае это не sgid, а запуск inetd.