Есть ли альтернативный API для getcwd, чтобы получить рабочую директорию процесса - PullRequest
0 голосов
/ 24 июня 2011

В нашем приложении мы вызываем getcwd(3), чтобы получить текущий рабочий каталог.

Когда процесс запускается, если кто-либо удаляет путь к каталогу, то процесс выполняется, но getcwd API не удается (возвращаетNULL).

Пример: имя процесса: a.exe присутствует в /root/appl/a.exe после выполнения a.exe, если текущий рабочий каталог удален, api getcwd(3) завершается неудачно.

Существует ли альтернативный API для getcwd(3), чтобы узнать текущий рабочий каталог процесса, даже если путь к каталогу удален?

Ответы [ 3 ]

3 голосов
/ 24 июня 2011

Я не совсем уверен, что вы будете делать с результатами текущего рабочего каталога , когда каталог будет продолжать существовать только до тех пор, пока он остается открытым -Вы не можете создавать новые файлы в каталоге, и он должен быть пустым, чтобы его можно было удалить - но вы можете использовать readlink(2) на /proc/self/cwd, чтобы найти имя:

$ 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;
}

мю слишком короткий правильно с егосовет chdir("/");, если это демон - я могу себе представить, что у вашей программы есть веская причина, чтобы иначе узнать ее текущий рабочий каталог, и даже иметь представление о том, каким мог бы быть путь, если он еще существует- но в общем, вам все равно.Путь "." будет работать практически во всех случаях, когда имеет смысл использовать текущий рабочий каталог, пока вам не понадобится встроенная оболочка pwd для пользователя.

0 голосов
/ 24 июня 2011

получите переменную среды $ PWD и кешируйте ее в своем приложении.

0 голосов
/ 24 июня 2011

Попробуйте это.

#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);
  }
}
...