В Linux приложение может легко получить свой абсолютный путь, запросив /proc/self/exe
. На FreeBSD это больше связано с тем, что вам нужно создать вызов sysctl:
int mib[4];
mib[0] = CTL_KERN;
mib[1] = KERN_PROC;
mib[2] = KERN_PROC_PATHNAME;
mib[3] = -1;
char buf[1024];
size_t cb = sizeof(buf);
sysctl(mib, 4, buf, &cb, NULL, 0);
но это все еще вполне выполнимо. Однако я не могу найти способ определить это на OS X для приложения с командной строкой. Если вы работаете из пакета приложений, вы можете определить его, запустив [[NSBundle mainBundle] bundlePath]
, но поскольку приложения из командной строки не находятся в связках, это не помогает.
(Примечание: консультация argv[0]
не является разумным ответом, так как при запуске из символической ссылки argv[0]
будет эта символьная ссылка, а не конечный путь к исполняемому вызову. argv[0]
также может лежать, если немое приложение использует вызов exec()
и забывает инициализировать argv правильно, что я видел в дикой природе.)