1. å¦æç¨åºä¸æ¯ç±èªå·±åï¼è¿æ¯ä¸ä¸ªç³ç³ç计åãç³ç³çç¨åºåºå
æä¸ç¹çBashèæ¬ï¼#!/bin/bash
set -e
cd $(readlink -f $(dirname $0))
exec ./myprog $*
ä¸é¢çèæ¬ç¡®å®æå¨çç®å½ï¼ç¶åæ´æ¹å½åå·¥ä½ç®å½å°è¯¥ç®å½å¹¶è¿è¡ä¸ä¸ªç¨åºmyprogä»é£éï¼éè¿ææéæãä½ å¿
é¡»æè¿ä¸ªèæ¬å°ä½ çç¨åºæå¨çç®å½ï¼ç¶åè¿è¡ä½ çç¨åºæ¥ä»£æ¿å®ã å设æ¨æ访é®æºä»£ç 并å¯ä»¥ä¿®å¤ç¨åºï¼procæ件系ç»æ¥ç¡®å®ç¨åºçä½ç½®åç»å¯¹è·¯å¾ã ä¾å¦ï¼/proc/self/exeå°æ°¸è¿æ¯ä¸ä¸ªç¬¦å·é¾æ¥æåçå½åè¿ç¨çäºè¿å¶æ件ã使ç¨readlink读åå®çå¼ CodeGo.netï¼ååå¯æ§è¡æ件åä½ å¾å°çç®å½ã
2. åºç°äºé®é¢ï¼åä¸æ®µæ¶é´å¦ä½æ¾å°å¨Cä¸çå¯æ§è¡æ件çä½ç½® ä½ æå¼ä½ çé
ç½®ï¼èµæºï¼çè¿ä¸ªè·¯å¾..
3. ä¸ç§æ¹æ³æ¯ARGV [0]-æä½ çç¨åºçç¸å¯¹è·¯å¾ï¼ä¾å¦./programs/test/a.outï¼ãå¦æä½ åçç¨åºï¼å¹¶æ·»å å°æ件çç¸å¯¹è·¯å¾ï¼ä½ ä¼å¾å°ä¸ä¸ªæªç©ï¼ä¾å¦./programs/test/../../input_dataï¼ï¼ä½å®åºè¯¥å·¥ä½ã
4. æç®åçæ¹æ³æ¯è¦ä¹æä½ çç¨åºå¨ä¸ä¸ªé¢å
ç¥éçå°æ¹ï¼/ binä¸ï¼/ usr / binä¸ï¼çï¼ãå¦æ没æï¼ä½ å¨argv [0]ï¼å é¤è¯¥ç¨åºï¼æåä¸é¨åï¼ï¼ä½ä¸ºä½ çå·¥ä½ç®å½åç¼çææç¸å¯¹è·¯å¾ï¼å¦æä½ æ³ç¸å¯¹è·¯å¾æ¯ç¸å¯¹äºä½ çç¨åºæ¯ï¼ã æ¤å¤ï¼ä½ å¯ä»¥å³å®ä½ çä¸é¢ï¼ä½¿ç¨çè·¯å¾argv[0]ï¼ï¼ç¶åè°ç¨ä¸ä¸ªchdir()ä¸æ¤ç®å½ãä»æ¤ææçç¸å¯¹è·¯å¾ä¸æ¯ç¸å¯¹äºæå¨çç¨åºãä½è¯·æ³¨æï¼å¨è¿ç§æ
åµä¸ï¼ä½ å¿
须确å®æ¯å¦argv[0]å æ®ç»å¯¹è·¯å¾ãå¦æ没æï¼ä½ å¿
é¡»å¾å°å½åå·¥ä½ç®å½ï¼getcwd()ï¼ï¼ç¶å追å çç®å½é¨åargv[0]ãä½æ¯ï¼è¯·æ³¨æï¼æ¹åå½åå·¥ä½ç®å½ãæ¯ä¸æ¯ä¸ä¸ªå¥½ä¸»æï¼é常æ
åµä¸ï¼ä»¿ä½ç»ä½ ä¸ä¸ªæ件路å¾ä½ä¸ºè¿å°æ¯ç¸å¯¹äºå½åçå·¥ä½ç®å½ï¼èä¸æ¯ç¸å¯¹äºæå¨çç¨åºåå¨ã ä¾åï¼æ³è±¡ä¸ä¸ï¼ä½ çç¨åºå¨çæ´»/usr/binãä½ å¯ä»¥æçµè¯ç»ä½ çç¨åºä¸ºï¼/usr/bin/myprog
ï¼è¿å°æ¯argv[0]ãtrimçå¯æ§è¡æ件ï¼ä½ æä½ çç®å½ãï¼æè
ï¼æ¯ï¼æ¯æ¹è¯´ï¼å¨/usrï¼./bin/myprog
ç°å¨ï¼argv[0]æ¯ä¸ä¸ªç¸å¯¹è·¯å¾ãä½ å¿
é¡»å¨åé¢å ä¸å½åå·¥ä½ç®å½ï¼/usrï¼å°ä¸ä¸ªå¨argv[0]ï¼/usr/./bin/myprogï¼ç¶åå次trimå¯æ§è¡æ件çç®å½å°å次/usr/binã
5. åçç¸å¯¹è·¯å¾ã使ç¨ç»å¯¹è·¯å¾ãä½ å¯è½æä¸ä¸ªconfig.h头æ件ä¸å®ä¹ç常éï¼æå®å®è£
çå¯æ§è¡æ件ãç¶åï¼åç½®ä¸ä¸ªå符串常éå°æ¨å¨ä»£ç ä¸æå®ä»»ä½ç¸å¯¹è·¯å¾ã
6. openatæå¼ç¸å¯¹äºä½ ä¼ éä¸ä¸ªç¹å®çç®å½æ件æ述符çæ件ï¼ä½æä¸è®¤ä¸ºè¿ççæ¯ä½ æ³è¦çï¼ç²¾ç¡®ï¼ä»ä¹ã ä½ å°éè¦æ¾å°å½åå¯æ§è¡æ件çç®å½ï¼ç¶åå建ä¸ä¸ªå¼æ¾çå¼å«ç¸å¯¹äºï¼ä½¿ç¨å符串è¿ç®ç¬¦æ¥å»ºç«è·¯å¾ï¼openatï¼ææ¹åå½åç®å½å°è¯¥ç®å½ï¼ã 为äºæ¾å°å¯æ§è¡æ件ï¼å¯ä»¥readlink/proc/self/exeãreadlink读åè·¯å¾ç符å·é¾æ¥æåï¼å¹¶/proc/selfæ¯ä¸ä¸ªç¬¦å·é¾æ¥/proc/<PID>åªé<PID>æ¯å½åè¿ç¨ï¼å¨å
æ ¸ä¸å¤çç¹æ®ï¼çè¿ç¨IDï¼ä»¥åexe以ä¸æ¯è¯¥è¿ç¨çå¯æ§è¡æ件ç符å·é¾æ¥ãç¶åï¼ä½ éè¦æé±çè·¯å¾çå¯æ§è¡æ件ï¼ã ææè¿ä¸åé½è¿ä¹è¯´ï¼åºè¯¥é¿å
è¿æ ·ä¸ç§æ¹å¼ï¼ä»ä»¬å¸ææ¾å°ç¸å¯¹äºå
¶å¯æ§è¡æ件çä¸è¥¿åç¨åºã
7. 好å§ï¼å¦æä½ çç¨åºéè¦ä»ä¾èµå®è£
ç¨åºæå¨çä½ç½®æå¼ä¸ä¸ªæ件æ¶ï¼ä½ åºè¯¥åè¿ä¸ªé项ãæä½ çç¼è¯ç³»ç»è®¾ç½®çCPPå®è¡¨ç¤ºï¼å
¶ä¸æé®é¢çæ°æ®æ件ï¼å¯ä»¥åç°è¯¥ç®å½ãè¿æ¯ä»ä¹æ ·ç-datadirçé项å¨æ åé
ç½®âçconfigureï¼makeï¼make installçâå
ç½®ç¨åºç»å¸¸åã å½ç¶ï¼å¦æä½ ççæ³è¦ï¼å¯ä»¥éè¿ç¼ç¨æ¹åå·¥ä½ç®å½ä¸chdirPOSIXå½æ°ãä½å°±åæ说çï¼å¦æä¸ä¸ªç¨åºéè¦ç¥éå®ä½äºä½å¤ï¼è¿åºè¯¥æ¯æä¾é£ä¹ä½ ä¸éè¦éåçéæ©å·¥ä½ç®å½ä¸ã
8. æ¨å¯ä»¥ä»ç¡®å®æ§è¡è·¯å¾argv[0]ä½è¿æ ·åçæ¶åè¦å°å¿ã ä½ ææè¿°çæ¯ä¸ä¸ªä¼æå¨ç¥çåé¢æçè¯ä¹ãç¨æ·expectè¿ç§è¡ä¸ºã
9. ä¸é¢æ¯ä»£ç ï¼ä½ è¦æ¾å°ä½ çç¨åºå¨ä½ çå®è£
è·¯å¾ï¼ä¸ä½ çç¨åºæ¿æ¢âtest0002âï¼ï¼#include <iostream>
#include <sstream>
#include <string>
#include <fstream>
#include <unistd.h>
///=============================================================================
std::string FindInstallPath()
{
std::string sret="";
int pid = (int)getpid();
bool b=false;
std::string sf, s;
std::stringstream ss;
ss << "/proc/" << pid << "/maps";
sf = ss.str();
std::ifstream ifs(sf.c_str());
size_t pos1, pos2;
while (!b && ifs.good())
{
std::getline(ifs, s);
if ((pos1 = s.rfind("test0002")) != std::string::npos)
{
if ((pos2 = s.find_first_of('/')) != std::string::npos)
sret = s.substr(pos2, pos1 - pos2);
b = true;
}
}
if (!b) sret = "";
ifs.close();
return sret;
}
温馨提示:答案为网友推荐,仅供参考