readlink устанавливает errno в ENOENT

Я неопытный программист Linux и пытаюсь научиться использовать readlink() основываясь на этом вопрос и ответ.

Мой звонок readlink() возвращает -1 и устанавливает errno до 2 (ENOENT).

Код:

#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <errno.h>
#include <iostream>
#include <algorithm>
#include <cstdio>

int main(int argc, char* argv[])
{
char szTmp[100];
snprintf(szTmp, 100, "proc/%d/exe", getpid());
std::cout << "szTmp is " << szTmp << std::endl;
char executingFolder[500];
errno = 0;
int bytes = std::min(readlink(szTmp, executingFolder, 500), (ssize_t)499);

if (bytes > 0)
{
executingFolder[bytes] = '\0';
}

std::cout << "bytes is " << bytes << std::endl;
std::cout << "errno is " << errno;
if (ENOENT == errno)
{
std::cout << " ENOENT";
}
std::cout << std::endl;
std::cout << "Executing folder is \"" << executingFolder << "\"" << std::endl;

return 0;
}

Выход:

(Пример из одной итерации с момента изменения pid)

szTmp is proc/22272/exe
bytes is -1
errno is 2 ENOENT
Executing folder is ""

Вещи, которые я пробовал:

  • После компиляции: sudo ./a.out (думая, что доступ к каталогу был ограничен из-за отсутствия разрешения). Результат: неизменное поведение от ./a.out
  • SIGINT программу во время выполнения и убедитесь, что /proc/<pid>/exe существует. Результат: он постоянно существует для каждого запуска программы.
  • Проверено, что значение целевой ссылки находится в пределах 499 символов.

Может кто-нибудь, пожалуйста, помогите определить проблему? Прочитав readlink Страница справочника и описания в Интернете, а также отмеченная статья StackOverflow, мне все еще неясно, что не так.

Спасибо.

0

Решение

proc/1234/exe это относительный путь.

Я думаю ты хочешь /proc/%d/exe, который является абсолютным путем и правильно относится к /proc каталог.


Во-вторых, потому что readlink() будет усекать результат в случае, если буфер слишком мал, вы должны рассмотреть случай, когда возвращаемое значение == bufsiz быть ошибкой, так как могло произойти усечение. Ты не можешь знать.


Также, «Исполняющая папка» это не то, что /proc/<pid>/exe дает тебе. /proc/<pid>/exe символическая ссылка на исполняемый в данный момент исполняемый файл (файл), а не каталог.

3

Другие решения

proc/22272/exe это относительный путь Разрешает в файл exeв каталоге 22272в каталоге proc, в вашем ток каталог. Если ваш текущий каталог /это вряд ли существует.

Вы хотите абсолютный имя пути, начинающееся с /, в этом случае /proc/22272/exe,

Изменить это:

snprintf(szTmp, 100, "proc/%d/exe", getpid());

к этому:

snprintf(szTmp, 100, "/proc/%d/exe", getpid());

Но прежде чем вы исправите свою программу, вы можете попробовать это:

( cd / ; ~/a.out )

(при условии, a.out находится в вашем домашнем каталоге).

1

По вопросам рекламы [email protected]