獲取當前工作目錄有多種方式。
1. getcwd 獲取工作目錄(啟動程序的目錄)
getcwd 可以獲取當前工作目錄,但不是目標程序所在目錄,而是啟動程序時所在的工作目錄。
比如,如果shell 從工作目錄/home/user啟動目標程序(位於/home/user/workspace/testpro/debug/test),那么通過getcwd得到的是/home/user。
同系列函數有3個:
getcw 調用者提供buf,以及指定最大長度(bytes),函數填充內容。實際路徑長度超過指定長度時,會返回NULL,errno被設置。通常路徑長度,最大不會超過系統限制_POSIX_PATH_MAX(頭文件<limits.h>)。
getwd 調用者提供buf,函數填充內容。buf長度最少應該是PATH_MAX。
get_current_dir_name 函數malloc緩沖區,調用者free(釋放)緩沖區。
注意:getcw不適用於開機啟動程序(未測試),參見linux下獲取程序當前目錄絕對路徑 |CSDN
#include <unistd.h>
char *getcwd(char *buf, size_t size);
char *getwd(char *buf);
char *get_current_dir_name(void);
示例
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#ifdef _POSIX_PATH_MAX
#define PATHNAME_MAX POSIX_PATH_MAX
#else
#define PATHNAME_MAX 1000
#endif
void pr_currendir()
{
char buf[PATHNAME_MAX];
/* 使用getcwd獲取啟動目錄 */
if (NULL == getcwd(buf, sizeof(buf))) {
fprintf(stderr, "getcwd error: %s", strerror(errno));
exit(1);
}
printf("current work path: %s\n", buf);
char *s;
/* 使用get_current_dir_name獲取啟動目錄 */
if ((s = get_current_dir_name()) == NULL) {
fprintf(stderr, "getcwd error: %s", strerror(errno));
exit(1);
}
printf("current dir name: %s\n", s);
if (s != NULL) {
free(s); /* 別忘了free get_current_dir_name malloc的緩沖區 */
}
}
2. readlink 獲取運行程序目錄(目標程序所在目錄)
readlink 用於讀取符號連接,並不能直接獲取當前運行程序所在目錄,而是要結合linux系統自身特點:用readlink,讀取符號鏈接/proc/self/exe來獲取目標程序所在目錄。
linux進程在運行的時候,會在/proc/目錄下存放有關進程的信息(只存放在RAM),可以通過該偽文件系統和內核數據結構進行交互。/proc/self/exe就是存放的運行程序的路徑,等價與/proc/當前運行進程的pid/exe。
#include <unistd.h>
ssize_t readlink(const char *path, char *buf, size_t bufsiz);
示例
void pr_curentdir()
{
char str[PATHNAME_MAX];
char buf[PATHNAME_MAX];
snprintf(str, sizeof(str), "/proc/%d/exe", pid);
/* <=>
snprintf(str, sizeof(str), "/proc/self/exe");
*/
readlink(str, buf, sizeof(str));
printf("current work path: %s\n", buf);
}
