В Linux приложение может легко получить свой абсолютный путь, запросив /proc/self/exe
. Во FreeBSD, это сложнее, так как вы должны построить SYSCTL вызов:Программно получить абсолютный путь для приложения командной строки OS X
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, что я видел в дикой природе.)
Чтение argv [0] - это решение, и ничто в этой ветке пока не убеждает меня. – bortzmeyer
@bortzmeyer: рассмотрите 'execl ("/home/hacker/.hidden/malicious ","/bin/ls "," -s ", (char *) 0);' - значение 'argv [0] ' is '"/bin/ls ", но это не имеет никакого отношения к имени исполняемого файла. –