Я неопытный программист 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
/proc/<pid>/exe
существует. Результат: он постоянно существует для каждого запуска программы.Может кто-нибудь, пожалуйста, помогите определить проблему? Прочитав readlink
Страница справочника и описания в Интернете, а также отмеченная статья StackOverflow, мне все еще неясно, что не так.
Спасибо.
proc/1234/exe
это относительный путь.
Я думаю ты хочешь /proc/%d/exe
, который является абсолютным путем и правильно относится к /proc
каталог.
Во-вторых, потому что readlink()
будет усекать результат в случае, если буфер слишком мал, вы должны рассмотреть случай, когда возвращаемое значение == bufsiz
быть ошибкой, так как могло произойти усечение. Ты не можешь знать.
Также, «Исполняющая папка» это не то, что /proc/<pid>/exe
дает тебе. /proc/<pid>/exe
символическая ссылка на исполняемый в данный момент исполняемый файл (файл), а не каталог.
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
находится в вашем домашнем каталоге).