К сожалению, нет никакого способа, чтобы получить полный путь к исполняемому файлу в OpenBSD.
Первый аргумент по соглашению указывает на имя файла, а не на полный путь, и вы не можете быть уверены, что родительский процесс будет следовать этому соглашению.
Эта команда, называемая exe, иллюстрирует это.
#include <stdio.h>
#include <fcntl.h>
#include <limits.h>
#include <stdlib.h>
#include <sys/wait.h>
int exe(const char * path, const char * fakepath)
{
pid_t pid = vfork() ;
if(pid == 0)
{
/* Child process */
int fd ;
const int TO = getdtablesize() ;
for(fd = 0 ; fd <= TO ; fd++)
{
close(fd);
}
open("/dev/tty", O_RDONLY) ;
open("/dev/tty", O_WRONLY) ;
open("/dev/tty", O_WRONLY) ;
const char *arguments[2] = { fakepath, NULL } ;
execvp(path, (char**)arguments) ;
perror("exe") ;
exit(1) ;
}
else if(pid > 0)
{
/* Parent process */
int status = 0 ;
if(waitpid(pid, &status, 0) != -1)
{
if(WIFEXITED(status))
{
return WEXITSTATUS(status) ;
}
else
{
printf("exe: child process failed\n") ;
return 1 ;
}
}
}
perror("exe") ;
return 1 ;
}
int main(int argc, char * argv[])
{
if(argc != 3)
{
printf("Usage: exe program /fake/first/program/argument\n") ;
return 1 ;
}
return exe(argv[1], argv[2]) ;
}
Теперь вы можете выполнить программу прохождения arbitraty первого аргумента, как это:
exe program /fake/first/program/argument
пользователя спросил Тео де Raadt осуществить то, что необходимо, чтобы быть в состоянии получить полный путь исполняемый файл в этом thread
Я думаю, мы могли бы придерживаться «путь» в качестве вспомогательного значения вектора и имеют ld.so делать в Realpath() вызов, если используется $ ORIGIN? Было бы так, что или имеют ядро хранят весь путь в течение всего процесса для получения с помощью sysctl(). Сейчас он сохраняет только последний компонент (разрешенного) исходного пути в p_comm.
И он ответил:
Дороговато для такой небольшой потребности.
Вы пробовали [SYSCTL?] (Http://www.openbsd.org/cgi-bin/man.cgi/OpenBSD-current/man3/sysctl.3?query=sysctl&sec=3) –
@BlueMoon : Да, я пытался получить 'kinfo_proc' через' sysctl() ', но' kinfo_proc-> p_comm' содержит только исполняемое имя (то есть: 'a.out'). – Thomas