首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> 關於C

C語言獲取當前工作目錄:getcwd 與 execlp 兩種實作比較

     編輯:關於C

前言

在撰寫跨平台或系統層級的 C 程式時,常需要取得程式執行時的當前工作目錄(Current Working Directory, CWD)。Linux 終端機提供 `pwd` 指令,但在 C 程式內部該如何取得?本文介紹兩種常見做法:系統呼叫 `execlp()` 執行外部指令,以及 POSIX 標準 API `getcwd()` 直接取得路徑。

方法一:使用 execlp() 執行外部指令

函式原型

int execlp(const char *file, const char *arg, ... /*, (char *)0 */);
  • file:要執行的指令名稱(會搜尋 PATH 環境變數)。
  • arg:傳遞給指令的參數列表,以 NULL 結尾。
  • 回傳值:成功不會返回;失敗回傳 -1,並設定 `errno`。

範例程式碼

#include 
#include 
#include 

int main(int argc, char *argv[]) {
    if (argc > 1 && strcmp(argv[1], "pwd") == 0) {
        // 執行 pwd 指令並輸出到 stdout
        execlp("pwd", "pwd", (char *)NULL);
        perror("execlp failed");
        return 1;
    }
    // 其他邏輯...
    return 0;
}

缺點:建立子行程開銷大、依賴外部指令存在、難以捕獲輸出供程式進一步處理。

方法二:使用 getcwd() 直接取得路徑(推薦)

函式原型

char *getcwd(char *buf, size_t size);
  • buf:緩衝區指標,用於儲存路徑字串。
  • size:緩衝區大小(位元組)。
  • 回傳值:成功回傳 `buf` 指標;失敗回傳 `NULL`,設定 `errno`(如 `ERANGE` 表示緩衝區太小)。

範例程式碼

#include 
#include 
#include 
#include   // PATH_MAX

int main() {
    char cwd[PATH_MAX];
    if (getcwd(cwd, sizeof(cwd)) != NULL) {
        printf("Current directory is: %s\n", cwd);
    } else {
        perror("getcwd failed");
        return 1;
    }
    return 0;
}

優點:無建立行程開銷、直接取得字串供後續處理、符合 POSIX 標準、跨平台可移植(Windows 使用 `_getcwd`)。

實戰比較:命令列參數控制行為

以下完整程式示範:無參數時用 `getcwd` 印出路徑;有參數時嘗試用 `execlp` 執行該指令。

#include 
#include 
#include 
#include 
#include 

int main(int argc, char *argv[]) {
    if (argc == 1) {
        // 模式 1:直接取得 CWD
        char cwd[PATH_MAX];
        if (getcwd(cwd, sizeof(cwd)))
            printf("Current directory is: %s\n", cwd);
        else
            perror("getcwd");
    } else {
        // 模式 2:執行使用者指定指令
        execvp(argv[1], &argv[1]); // 自動搜尋 PATH
        perror("execvp failed");   // 若執行失敗會跑到這裡
        return 1;
    }
    return 0;
}

執行結果範例

$ ./cwd_demo
Current directory is: /home/user/project

$ ./cwd_demo pwd
/home/user/project

$ ./cwd_demo ls -l
total 24
-rwxr-xr-x 1 user user 16384 Jan 1 10:00 cwd_demo
-rw-r--r-- 1 user user   512 Jan 1 09:55 cwd_demo.c

$ ./cwd_demo nonexistent_cmd
execvp failed: No such file or directory

常見錯誤與注意事項

  1. 緩衝區太小:若路徑超過 `PATH_MAX`,`getcwd` 會失敗並設 `errno = ERANGE`。解法:動態配置記憶體並以迴圈重試,或使用 GNU 延伸 `getcwd(NULL, 0)` 自動配置(需自行 `free`)。
  2. execlp 參數結尾:參數列表必須以 `(char *)NULL` 結尾,否則行為未定義。
  3. Windows 相容性:Windows 無 `execlp`,需用 `_execlp` 或 `CreateProcess`;`getcwd` 對應 `_getcwd`,標頭檔為 ``。

總結

在 C 語言中取得當前工作目錄,**強烈建議使用 `getcwd()`**。它效能高、可攜性好、且能直接取得字串供程式邏輯使用。`execlp()` 適合需要實際執行外部指令並將輸出直接導向終端機的場合,而非單純取得路徑字串。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved