如何从内部findC ++ Linux程序的完整path?

我有这个需求,我需要从内部findC ++程序的完整path。 对于Windows,我有以下解决scheme。 argv [0]可能包含也可能不包含完整path。 但我需要确定。

TCHAR drive[_MAX_DRIVE], dir[_MAX_DIR], base[_MAX_FNAME], ext[_MAX_EXT]; TCHAR fullPath[255+1]; _splitpath(argv[0],drive,dir,base,ext); SearchPath(NULL,base,ext,255,fullPath,NULL); 

上述代码的Linux(gcc)等价物是什么? 很想看到一个便携式的代码。

Solutions Collecting From Web of "如何从内部findC ++ Linux程序的完整path?"

在Linux(Posix?)上,您有一个链接到可执行文件完整路径的符号链接/proc/self/exe

在Windows上,使用GetmoduleeFileName

永远不要依赖argv[0] ,这不能保证是有用的。

请注意,路径和文件系统不是该语言的一部分,因此必然是平台相关的功能。

这个问题的最佳答案列出了一大堆操作系统的技巧:

找到没有/ proc / self / exe的当前可执行文件的路径

 string get_path( ) { char arg1[20]; char exepath[PATH_MAX + 1] = {0}; sprintf( arg1, "/proc/%d/exe", getpid() ); readlink( arg1, exepath, 1024 ); return string( exepath ); } 

对于Linux:
执行系统命令的功能

 int syscommand(string aCommand, string & result) { FILE * f; if ( !(f = popen( aCommand.c_str(), "r" )) ) { cout << "Can not open file" << endl; return NEGATIVE_ANSWER; } const int BUFSIZE = 4096; char buf[ BUFSIZE ]; if (fgets(buf,BUFSIZE,f)!=NULL) { result = buf; } pclose( f ); return POSITIVE_ANSWER; } 

然后我们得到应用程序名称

 string getBundleName () { pid_t procpid = getpid(); stringstream toCom; toCom << "cat /proc/" << procpid << "/comm"; string fRes=""; syscommand(toCom.str(),fRes); size_t last_pos = fRes.find_last_not_of(" \n\r\t") + 1; if (last_pos != string::npos) { fRes.erase(last_pos); } return fRes; } 

然后我们提取申请路径

  string getBundlePath () { pid_t procpid = getpid(); string appName = getBundleName(); stringstream command; command << "readlink /proc/" << procpid << "/exe | sed \"s/\\(\\/" << appName << "\\)$//\""; string fRes; syscommand(command.str(),fRes); return fRes; } 

不要忘了修剪线后