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

C語言獲取程序當前工作路徑:getcwd 與 execlp 兩種方案

     編輯:關於C語言

C語言獲取程序當前工作路徑:getcwd 與 execlp 兩種方案

在 Linux/Unix 系統編程中,獲取當前工作目錄(CWD)是常見需求。本文介紹兩種方法:標準 API getcwd() 和通過 execlp() 調用 shell 命令 pwd。

方案一:getcwd() 系統調用(推薦)

函數原型:char *getcwd(char *buf, size_t size);

  • buf:存儲路徑的緩衝區
  • size:緩衝區大小
  • 成功返回 buf,失敗返回 NULL

方案二:execlp() 調用 pwd 命令(間接)

函數原型:int execlp(const char *file, const char *arg, ..., (char *)NULL);

  • 在子進程中執行 pwd 命令
  • 需配合 fork() 使用,否則會替換當前進程
  • 返回 -1 表示失敗

完整演示程序

#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 平台注意

Windows 使用 _getcwd() (需 <direct.h>) 或 GetCurrentDirectory() (Windows API)。

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