web-dev-qa-db-ja.com

現在のプロセスのPIDが必要、getpid()は-1を返します

プロセス(C++プログラムの実行)で使用されるファイルに一意の名前を付ける必要があります。静的文字列を使用する前に、プログラムの2つのインスタンスを並行して実行しようとすると、両方が同じファイルにアクセスしていることに気付きました。

このため、ファイル名に、それを作成して使用しているプロセスのPIDを含めたいと思います。

ただし、getpid()を使用しようとすると、常に_-1_が戻り値として返されます。

_void accessfile(){
   std::cout << "DEBUG: accessfile() called by process " << getpid() << " (parent: " << getppid() << ")" << std::endl;
   // Code here to create and/or access the file
}
_

これを実行すると、次のようになります。

_DEBUG: accessfile() called by process -1 (parent: 17565)
_

私は_ps ux_を確認しましたが、プロセス_17565_は実際にはログインシェルです。現在実行中のプログラムのPIDを取得するにはどうすればよいですか?

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.
_

実際、私はglibc 2.4を使用しています。対応するgetpid()なしでfork()を使用すると問題が発生する可能性があることを理解していますが、それらの動作がわかりません。 getppid()は親PID(ログインシェル)を正しく取得しますが、getpid()の戻り値は意味をなさないようです。

誰もが-1を返す理由(この戻り値の意味を詳しく説明したドキュメントが見つからない)、およびプロセスIDを取得する方法を明らかにできますか?現在のプロセスIDを取得するには、ダミープロセスjustをフォークする必要がありますか?ありがとう!

8
tomocafe

C++でシステム関数を呼び出すときは、その名前空間(この場合はグローバルな名前空間)を明示的に使用することをお勧めします。

void accessfile(){
   std::cout << "DEBUG: accessfile() called by process " << ::getpid() << " (parent: " << ::getppid() << ")" << std::endl;
   // Code here to create and/or access the file
}

そして、それはusing namespace std;建設

15
Slava