В 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, что я видел в дикой природе.)