Müssen die PID des aktuellen Prozesses, getpid() gibt -1 zurück
Ich brauche zu kommen mit einem eindeutigen Namen für eine Datei, die von einem Prozess (die Ausführung meiner C++ - Programm). Bevor ich einen statischen string, aber wenn ich versuchte zu laufen, zwei Instanzen des Programms parallel, erkannte ich, dass Sie waren beide auf dieselbe Datei zugreifen können.
Zu diesem Zweck möchte ich den Namen der Datei beinhalten die PID des Prozesses, der Sie erstellt und nutzt.
Jedoch, wenn ich versuche, mit getpid()
ich immer scheinen, um -1
als Rückgabewert.
void accessfile(){
std::cout << "DEBUG: accessfile() called by process " << getpid() << " (parent: " << getppid() << ")" << std::endl;
//Code here to create and/or access the file
}
Wenn ich diese ausführe, bekomme ich:
DEBUG: accessfile() called by process -1 (parent: 17565)
Habe ich überprüft ps ux
und der Prozess 17565
ist tatsächlich meine login-shell. Wie bekomme ich die PID des Programms, die ich derzeit ausgeführt wird?
Bemerkte ich dieses bit an information in den manual-Eintrag für getpid()
:
Since glibc version 2.3.4, the glibc wrapper function for getpid()
caches PIDs, so as to avoid additional system calls when a process
calls getpid() repeatedly. Normally this caching is invisible, but
its correct operation relies on support in the wrapper functions for
fork(2), vfork(2), and clone(2): if an application bypasses the glibc
wrappers for these system calls by using syscall(2), then a call to
getpid() in the child will return the wrong value (to be precise: it
will return the PID of the parent process). See also clone(2) for
discussion of a case where getpid() may return the wrong value even
when invoking clone(2) via the glibc wrapper function.
Bin ich in der Tat die Verwendung von glibc-2.4. Ich verstehe, dass die Verwendung getpid()
ohne eine entsprechende fork()
ein Problem verursachen können, aber ich sehe nicht ein, das Verhalten, die Sie beschreiben. getppid()
richtig bekommt das übergeordnete PID (login-shell), aber noch nicht die Gegenleistung Wert von getpid()
scheint nicht sinnvoll.
Kann jemand Aufschluss geben, warum es gibt -1 zurück (finde keine Dokumentation, die erläutert, was dieser Rückgabewert bedeutet), und auch, wie ich möglicherweise in der Lage sein, um die Prozess-ID? Muss ich nur die Gabel ein dummy-Prozess nur, um die aktuelle Prozess-ID? Danke!
getpid()
Aufruf soll nicht in der Lage sein, zu Versagen, oder eine negative Rendite PID. Die glibc
wrapper klingt gebrochen zu mir; ich denke, es ist nicht, aber ehrlich gesagt, die wrapper-klingt nach mehr ärger als es Wert ist. Verdammt noch mal, wenn ich den Anruf getpid()
möchte ich die PID des Prozesses mein, unabhängig davon, wie Sie erstellt wurde. (POSIX getpid()
sagt: Die getpid()
Funktion Rückgabe der Prozess-ID des aufrufenden Prozesses. und auch Die getpid()
Funktion wird immer erfolgreich sein und keinen Rückgabewert ist reserviert, um anzuzeigen, ein Fehler.Was OS Sie verwenden (inklusive version)? Auch stellen Sie sicher, dass Sie nicht überschreiben-system-Funktion
getpid()
mit einigen wrapper, makro usw. in Ihrem Projekt.Distribution:
CentOS release 4.8 (Final)
Kernel: Linux 2.6.9-89.ELlargesmp #1 SMP Mon Jun 22 12:46:58 EDT 2009
Schreiben Sie ein minimales Programm in c++ , nur druckt die aktuelle pid, die cout. Verwenden Sie keine Ihrer Bibliotheken etc. Was bedeutet es Ausgabe?
jemand fügte eine Methode
getpid()
Rückkehr der pid_t
Daten-member einer Klasse haben wir... ich hätte nie gedacht, zu prüfen. Vielen Dank für den Einblick.InformationsquelleAutor Evan W | 2014-07-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
Beim Aufruf der Systemfunktionen in C++ ist es eine gute Idee, um explizit deren namespace (global one in diesem Fall):
Und es zeigt, warum es eine schlechte Idee, verwenden Sie
using namespace std;
BauInformationsquelleAutor Slava