我试过了:
char *path = realpath(getenv("_"), NULL);
*(strrchr(path, '/')+1) = '\0';
这有效,但如果我的可执行文件由父进程调用, 然后显示父进程的路径。
我搜索了很多,但我找不到任何正常工作的解决方案。
/proc
是不可取的。
答案 0 :(得分:1)
经过一些实验,我认为我有一个有效的解决方案......
An error occurred trying to connect: Post https://192.168.59.103:2376/v1.19/containers/create: remote error: bad certificate
答案 1 :(得分:0)
遗憾的是,无法在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] ) ;
}
现在你可以执行一个传递任意第一个参数的程序,如下所示:
exe program /fake/first/program/argument
用户要求Theo de Raadt实现在此thread
中获取已执行文件的完整路径所需的内容我想我们可以将'path'粘贴到辅助矢量值中并且具有 ld。如果使用$ ORIGIN,还要调用realpath()吗?就是那个或者 让内核存储进程生命周期的整个路径 使用sysctl()获取。现在它只存储最后一个组件 p_comm中的(已解析的)原始路径。
他回答说:
相当昂贵,因为这么小的需求。