Ich bin ein unerfahrener Linux-Programmierer und versuche zu lernen, readlink()
basierend auf dieser question and answer zu verwenden.readlink sets errno zu ENOENT
Mein Aufruf an readlink()
gibt -1 zurück und setzt errno
zu 2 (ENOENT
).
Der Code:
#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;
}
Der Ausgang:
(Ein Beispiel von einer Iteration seit pid Änderungen)
szTmp is proc/22272/exe
bytes is -1
errno is 2 ENOENT
Executing folder is ""
Dinge, die ich versucht habe:
- Nach der Kompilierung:
sudo ./a.out
(denken, dass der Verzeichniszugriff wegen fehlender Erlaubnis eingeschränkt wurde). Ergebnis: Unverändertes Verhalten von./a.out
- SIGINT das Programm während der Ausführung und verifiziert, dass
/proc/<pid>/exe
existiert. Ergebnis: Es existiert konsistent für jeden Lauf des Programms. - Überprüft, dass der Wert der Zielverbindung innerhalb von 499 Zeichen liegt.
Kann jemand bitte helfen, das Problem zu identifizieren? Nachdem ich die readlink
Manpage und Online-Beschreibungen gelesen habe, und den notierten StackOverflow-Artikel, bin ich immer noch unklar, was falsch ist.
Vielen Dank.
Ich habe dich dazu geschlagen! –
Danke, ich verstehe deine Erklärung und meinen Fehler jetzt. – StoneThrow
@KeithThompson Sie haben tatsächlich, um etwa 30 Sekunden, aber ich musste die anderen zwei Fehler aufbringen. –