在 Linux/Unix 系統編程中,獲取當前工作目錄(CWD)是常見需求。本文介紹兩種方法:標準 API getcwd() 和通過 execlp() 調用 shell 命令 pwd。
函數原型:char *getcwd(char *buf, size_t size);
buf:存儲路徑的緩衝區size:緩衝區大小buf,失敗返回 NULL函數原型:int execlp(const char *file, const char *arg, ..., (char *)NULL);
pwd 命令fork() 使用,否則會替換當前進程#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
#define MAX_PATH 1024
// 方法 1:getcwd
void get_cwd_api() {
char buf[MAX_PATH];
if (getcwd(buf, sizeof(buf))) {
printf("API 獲取: %s\n", buf);
} else {
perror("getcwd 失敗");
}
}
// 方法 2:execlp + fork
void get_cwd_shell() {
pid_t pid = fork();
if (pid == 0) {
// 子進程執行 pwd
execlp("pwd", "pwd", NULL);
perror("execlp 失敗");
exit(1);
} else if (pid > 0) {
wait(NULL); // 等待子進程結束
} else {
perror("fork 失敗");
}
}
int main(int argc, char *argv[]) {
if (argc == 1) {
get_cwd_api(); // 默認使用 API
} else if (strcmp(argv[1], "pwd") == 0) {
get_cwd_shell(); // 參數為 pwd 時使用 shell
} else {
printf("未知命令: %s\n", argv[1]);
}
return 0;
}
$ ./cwd_demo API 獲取: /home/user/projects $ ./cwd_demo pwd /home/user/projects $ ./cwd_demo unknown_cmd 未知命令: unknown_cmd
| 特性 | getcwd() | execlp(pwd) |
|---|---|---|
| 效率 | 高(系統調用) | 低(創建進程) |
| 可移植性 | POSIX 標準 | 依賴 shell 環境 |
| 錯誤處理 | 直接返回錯誤碼 | 需檢查子進程狀態 |
| 適用場景 | 常規獲取 CWD | 教學、特殊環境 |
Windows 使用 _getcwd() (需 <direct.h>) 或 GetCurrentDirectory() (Windows API)。