一、getcwd函数说明:
getcwd函数获取的是当前的工作目录。下面以示例说明:
目录/home/liumin/program/getcwd/ 下程序main.c:(不包括任何错误处理)
#include #include
int main(int argc, char *argv[]) { char buf[1024];
printf("getcwd=%s\n", getcwd(buf, sizeof(buf))); printf("argv[0]=%s\n", argv[0]);
return 0; }
|
编译后生成执行文件:m
操作:
情况1. 在根目录 / 下执行:
[liumin@localhost /]$ /home/liumin/program/getcwd/m
输出结果:
getcwd=/
argv[0]=/home/liumin/program/getcwd/m
情况2. 在根目录 / 下执行:
[liumin@localhost /]$ ./home/liumin/program/getcwd/m
输出结果:
getcwd=/
argv[0]=./home/liumin/program/getcwd/m
情况3. 在当前目录下(/home/liumin/program/getcwd)执行
[liumin@localhost getcwd]$ ./m
输出结果:
getcwd=/home/liumin/program/getcwd
argv[0]=./m
情况4. 在目录:/home/liumin/test下执行shell脚本中调用m
[liumin@localhost test]$ ./test.sh
输出结果:
getcwd=/home/liumin/test
argv[0]=/home/liumin/program/getcwd/m
test.sh在目录 /home/liumin/test下,其内容为:
#!/bin/sh /home/liumin/program/getcwd/m
|
二、目的:
无论如何执行,都需要得到结果:/home/liumin/program/getcwd/m
三、思路:getcwd + argv[0] + 一些小处理。
四、示例代码:
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <errno.h> #include <string.h> #include <limits.h>
#ifdef PATH_MAX static int pathmax = PATH_MAX; #else static int pathmax = 0; #endif
#define SUSV3 200112L
static long posix_version = 0;
/* IF PATH_MAX is indeterminate, no guarantee this is adequate */ #define PATH_MAX_GUESS 1024
/* also return allocated size, if nonnull*/ char *path_alloc(unsigned int *sizep) { char *ptr; unsigned int size;
if (posix_version == 0) posix_version = sysconf(_SC_VERSION); if (pathmax == 0) { /* first time through */ errno = 0; if ((pathmax = pathconf("/", _PC_PATH_MAX)) < 0) { if (errno == 0) pathmax = PATH_MAX_GUESS; /* it's indeterminate */ else { perror("pathconf error for _PC_PATH_MAX!"); return NULL; } } else pathmax++; /* add one since it's relative to root */ } if (posix_version < SUSV3) size = pathmax + 1; else size = pathmax;
if ((ptr = malloc(size)) == NULL) { perror("malloc error for pathname!"); return NULL; }
if (sizep != NULL) *sizep = size; return ptr; }
char *get_absolute_name(const char *argv0, char *buf, size_t size) { unsigned int len; char *pathbuf; unsigned int buflen; const char *index;
if (!buf) { errno = EFAULT; return NULL; }
pathbuf = path_alloc(&buflen); if (pathbuf == NULL) return NULL;
if (getcwd(pathbuf, buflen) == NULL) { perror("getcwd error!");
free(pathbuf); return NULL; }
if (*argv0 == '/' && len != 1) { if (strlen(argv0) > size) { errno = ERANGE;
free(pathbuf); return NULL; } else { strncpy(buf, argv0, strlen(argv0)); free(pathbuf);
return buf; } }
/* getcwd + argv[0] */ len = strlen(pathbuf); if(pathbuf[len - 1] != '/') pathbuf[len] = '/'; index = argv0; while ((*index == '.') || (*index == '/')) index++;
if (strlen(pathbuf) + strlen(index) > size) { errno = ERANGE;
free(pathbuf); return NULL; } else { sprintf(buf, "%s", pathbuf); strcat(buf, index); } free(pathbuf); return buf; }
int main(int argc, char *argv[]) { char buf[1024]; int ret; char *p;
p = get_absolute_name(argv[0], buf, sizeof(buf)); if(p != NULL) { printf("cwd=%s\n", buf); } else perror("getcwd");
exit(0); }
|
参考资料:
apue2 程序清单2-3
17 楼思路:getcwd + argv[0] + 一些小处理。
阅读(2014) | 评论(0) | 转发(0) |