⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 program-get-current-dir.html

📁 学习linux的工具书
💻 HTML
字号:
<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
<html>
<head>
   <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
   <meta name="Author" content="Edward Fu">
   <meta name="GENERATOR" content="Mozilla/4.05 [zh-CN] (X11; I; Linux 2.1.127 i686) [Netscape]">
   <title>Freesoft Linux FAQ -- 如何在编程时得到程序本身所在目录</title>
</head>
<body>
Edward Fu wrote:
<p>> 请问用什么函数可以得到程序本身所在的目录?
<br>> 比如我在/root下执行/usr/local/bin/myprogram,用什么函数得到
<br>> '/usr/local/bin'目录呢?
<br>> 总不能让我取调用type命令去查吧。 :-(
<br>>
<br>> 先谢了。
<br>> 伏建军
<p>伏先生:
<p>我给你写了个函数,不知合不合你的意?源代码和例子在附件中。
<p>宫敏
<p>--
<br>----
<br>NT=No Thanks, WWW=World Wide Wait
<br>Does PnP mean "Plug and Pray"?
<p>/* getprgdir.c
<br>&nbsp;*
<br>&nbsp;* char *GetPrgDir(char *Cmd, char *DirBuf, LenLimit)
<br>&nbsp;* Get the directory of a program.
<br>&nbsp;*
<br>&nbsp;* Author: Min Gong
<br>&nbsp;*
<br>&nbsp;* History:
<br>&nbsp;*
<br>&nbsp;* Jun/3/1998&nbsp; 1, Added the Pointer checking for the DirBuf
parameter.
<br>&nbsp;*&nbsp;&nbsp; 2, Fixed memory leak. (forgot to free up the allocated
<br>&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memory) Clean up.
<br>&nbsp;*&nbsp;&nbsp; 3, Added one more condition checking. For the current
<br>&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; directory it now returns the
absolute path instead
<br>&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; of "." is this more correct?
<br>&nbsp;*&nbsp;&nbsp; 4, The current directory is the one when the program
<br>&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; started. This should not be affected
by chdir() calls.
<br>&nbsp;*
<br>&nbsp;*&nbsp;&nbsp; Please tell me, if some one called putenv() or
setenv()
<br>&nbsp;*&nbsp;&nbsp; before calling me, how should I handle?
<br>&nbsp;*
<br>&nbsp;* Jun/2/1998&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Created.
<br>&nbsp;*
<br>&nbsp;* Copyright (C) Min Gong 1998.
<br>&nbsp;*
<br>&nbsp;* Licensing: GPL V2
<br>&nbsp;*
<br>&nbsp;* A Copy of GPL V2 can be find at:
<br>&nbsp;*&nbsp; http://freesoft.cei.gov.cn/gpl-asc.txt
<br>&nbsp;*
<br>&nbsp;* A Chinese translation of GPL V2 can be find at:
<br>&nbsp;*&nbsp; http://freesoft.cei.gov.cn/gpl-gb.txt
<br>&nbsp;*
<br>&nbsp;* Note 1:
<br>&nbsp;*&nbsp; If you include this code in your program then LGPL is
applied.
<br>&nbsp;*
<br>&nbsp;* Note 2:
<br>&nbsp;* This code takes anti buffer overflow attack into consideration.
<br>&nbsp;*
<br>&nbsp;*
<br>&nbsp;* Bug report: min@freesoft.cei.gov.cn
<br>&nbsp;* site:
<br>&nbsp;* ftp://freesoft.cei.gov.cn/pub/freesoft.sic/freesoft/Linux/getprgdir.c
<br>&nbsp;*
<br>&nbsp;*/
<p>#include &lt;string.h>
<br>#include &lt;stdlib.h>
<br>#include &lt;unistd.h>
<br>#include &lt;stdio.h>
<p>#define&nbsp; MAX_PATHLEN 1024
<p>char *GetPrgDir(char *Cmd, char *DirBuf, int LenLimit){
<br>&nbsp; int PathLen, OK;
<br>&nbsp; char *Ptmp, tmp, *PrgPtr, *Buf, *Path, *EnvPath, *PWD;
<p>&nbsp; if(Cmd==NULL || DirBuf==NULL) return NULL;
<br>&nbsp; PWD = getenv("PWD");
<br>&nbsp; Buf=malloc(MAX_PATHLEN);
<br>&nbsp; if(! (PrgPtr=strrchr(Cmd, '/'))){/* The Cmd is aprogram name,
not a path name
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Check $PATH is needed&nbsp; */
<br>&nbsp;&nbsp;&nbsp; EnvPath=getenv("PATH");
<br>&nbsp;&nbsp;&nbsp; if(EnvPath==NULL){&nbsp; /* PATH is not set&nbsp;
*/
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; free(Buf);
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return NULL;&nbsp; /* Hmm, this is ridiculous!
*/
<br>&nbsp;&nbsp;&nbsp; }
<br>&nbsp;&nbsp;&nbsp; PathLen=strlen(EnvPath);
<br>&nbsp;&nbsp;&nbsp; Path=malloc(PathLen);
<br>&nbsp;&nbsp;&nbsp; bcopy(EnvPath, Path, PathLen);
<br>&nbsp;&nbsp;&nbsp; Ptmp=Path;
<br>&nbsp;&nbsp;&nbsp; OK = 0;
<br>&nbsp;&nbsp;&nbsp; while(*Ptmp != (char)0 &amp;&amp; !OK){
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PathLen=0;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(*Ptmp != ':' &amp;&amp; *Ptmp
!= (char)0){
<br>&nbsp;PathLen++; Ptmp++;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(PathLen+strlen(Cmd) > (MAX_PATHLEN-2)){
<br>&nbsp;free(Buf); /* Although heap is a bit safer, but I check it */
<br>&nbsp;free(Path);
<br>&nbsp;return NULL; /* anyway to protect the heap. No buffer overflow
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; attack! */
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tmp=*Ptmp;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *Ptmp=(char)0;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(*(Ptmp-PathLen)=='.' &amp;&amp; PathLen==1){
<br>&nbsp;PathLen=strlen(PWD);
<br>&nbsp;bcopy(PWD, Buf, PathLen);
<br>&nbsp;Ptmp=PWD+PathLen;
<br>&nbsp;*(Buf+PathLen) = '/';
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else
<br>&nbsp;bcopy(Ptmp-PathLen, Buf, PathLen);
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *(Buf+PathLen)='/';
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bcopy(Cmd, Buf+PathLen+1, strlen(Cmd));
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *(Buf+PathLen+1+strlen(Cmd))=(char)0;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OK=(0==access(Buf, X_OK)); /* Exec permision?
*/
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(OK){
<br>&nbsp;bcopy(Ptmp-PathLen, DirBuf, PathLen);
<br>&nbsp;*(DirBuf+PathLen)=(char)0;
<br>&nbsp;free(Path);
<br>&nbsp;free(Buf);
<br>&nbsp;return DirBuf;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *Ptmp = tmp;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(*Ptmp) Ptmp++;
<br>&nbsp;&nbsp;&nbsp; }
<br>&nbsp; }
<br>&nbsp; else{&nbsp; /* The Path is Givien */
<br>&nbsp;&nbsp;&nbsp; int PWDlen, Cmdlen;
<br>&nbsp;&nbsp;&nbsp; char *p;
<p>&nbsp;&nbsp;&nbsp; PWDlen = strlen(PWD);
<br>&nbsp;&nbsp;&nbsp; Cmdlen = strlen(Cmd);
<br>&nbsp;&nbsp;&nbsp; if(Cmdlen+PWDlen > MAX_PATHLEN-2){
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; free(Buf);
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return NULL;
<br>&nbsp;&nbsp;&nbsp; }
<br>&nbsp;&nbsp;&nbsp; bcopy(PWD, Buf, PWDlen);
<br>&nbsp;&nbsp;&nbsp; Buf[PWDlen]='/';
<br>&nbsp;&nbsp;&nbsp; Buf[PWDlen+1]=(char)0;
<br>&nbsp;&nbsp;&nbsp; strcat(Buf, Cmd);
<br>&nbsp;&nbsp;&nbsp; if(0 != access(Buf, X_OK)){ /* This is again a ridiculous
condition. But
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this might happen if the passed
Cmd is not
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; the programs arg[0].&nbsp;&nbsp;
*/
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; free(Buf);
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return NULL;
<br>&nbsp;&nbsp;&nbsp; }
<br>&nbsp;&nbsp;&nbsp; p = strrchr(Buf, '/');
<br>&nbsp;&nbsp;&nbsp; *p = (char)0;
<br>&nbsp;&nbsp;&nbsp; if(p - Buf > LenLimit -1){
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; free(Buf);
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return NULL; /* No way to attack me!
*/
<br>&nbsp;&nbsp;&nbsp; }
<br>&nbsp;&nbsp;&nbsp; bcopy(Buf, DirBuf, p-Buf+1);
<br>&nbsp;&nbsp;&nbsp; free(Buf);
<br>&nbsp;&nbsp;&nbsp; return DirBuf;
<br>&nbsp; }
<br>&nbsp; return NULL;
<br>}
<br>&nbsp;
<p>/*=================CUT HERE! This is just an Usage Example ===============*/
<br>#include &lt;stdio.h>
<p>void main(int argc, char** argv){
<br>&nbsp; char Buffer[1024];
<p>&nbsp; chdir("/"); /* I can handle this now */
<br>&nbsp; printf("%s\n",GetPrgDir(argv[1], Buffer, 1024));
<br>}
<br>&nbsp;
<br>&nbsp;
<br>&nbsp;
<br>&nbsp;
</body>
</html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -