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!

Die 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

Schreibe einen Kommentar