2011-06-24 28 views
0

在我們的應用程序中,我們調用getcwd(3)來獲取當前工作目錄。getcwd是否有任何替代API來獲取進程的工作方向

當進程開始運行時,如果有人刪除目錄路徑,則進程正在運行,但getcwd API失敗(返回NULL)。

示例: 進程名稱是:a.exe存在於/root/appl/a.exe 運行a.exe,如果當前工作目錄被刪除getcwd(3) API失敗之後。

是否有任何替代API爲getcwd(3)知道進程的當前工作目錄,即使目錄路徑被刪除?

+2

如果該目錄已被刪除,會有什麼回報?如果你像守護進程那樣運行某個東西,那麼你幾乎應該立即'chdir(「/」);'。 –

+0

通過創建一個臨時目錄來部署應用程序,在appln開始運行後,臨時文件夾將被刪除...因此,getcwd調用失敗....我需要知道的是任何其他方式來知道進程的本地目錄... [用於linux系統] – Syedsma

回答

3

我不完全相信你會做當前工作目錄的結果什麼時候該目錄將繼續只只要它保持打開存在的 - 你不能創建新文件在目錄中,並且它必須是空的,因此它可以被刪除 - 但你可以/proc/self/cwd使用readlink(2)發現名稱:

$ mkdir syedsma 
$ cd syedsma/ 
$ /tmp/proccwd 
/proc/self/cwd reports: /tmp/syedsma 
$ /tmp/getcwd 
getcwd: /tmp/syedsma 
$ rmdir ../syedsma/ 
$ /tmp/getcwd 
getcwd failed: No such file or directory 
$ /tmp/proccwd 
/proc/self/cwd reports: /tmp/syedsma (deleted) 
$ 

這裏是我的getcwd.c

#include <stdio.h> 
#include <unistd.h> 

int main(int argc, char* argv[]) { 
    char p[1000]; 
    char *r; 
    r = getcwd(p, sizeof(p)); 
    if (!r) 
     perror("getcwd failed"); 
    else 
     printf("getcwd: %s\n", p); 
    return 0; 
} 

這是我的proccwd.c

#include <stdio.h> 
#include <unistd.h> 
#include <limits.h> 

int main(int argc, char* argv[]) { 
    char buf[PATH_MAX]; 

    ssize_t r = readlink("/proc/self/cwd", buf, sizeof(buf)); 

    if (r < 0) { 
     perror("readlink /proc/self/cwd failed"); 
     return 1; 
    } else { 
     buf[PATH_MAX-1] = '\0'; 
     printf("/proc/self/cwd reports: %s\n", buf); 
    } 
    return 0; 
} 

mu is too short是他的意見,以chdir("/");正確的,如果它是一個服務 - 我可以想像,你可能有一個很好的理由,你的程序知道,否則目前的工作目錄,甚至可以瞭解路徑名稱如果仍然存在的話 - 但總的來說,你不應該在意。路徑名爲"."將適用於所有需要當前工作目錄的情況,直到您需要實現用戶內置的pwd shell爲止。

0

試試這個。

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <sys/stat.h> 
#include <unistd.h> 

int main() { 
    char path[256]; 
    char buf[BUFSIZ]; 

    mkdir("/tmp/foo", 0755); 
    chdir("/tmp/foo"); 
    rmdir("/tmp/foo"); 

    sprintf(path, "/proc/%d/cwd", getpid()); 
    if (readlink(path, buf, sizeof(buf)) != -1) { 
    char* stop = buf+strlen(buf)-10; 
    if (!strcmp(stop, " (deleted)")) { 
     *stop = 0; 
    } 
    printf("[%s]\n", buf); 
    } 
} 
0

獲取$ PWD環境變量並將其緩存到您的應用程序中。

相關問題