1*6777b538SAndroid Build Coastguard Worker // Copyright 2013 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker #ifndef BASE_PROCESS_PROCESS_HANDLE_H_ 6*6777b538SAndroid Build Coastguard Worker #define BASE_PROCESS_PROCESS_HANDLE_H_ 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker #include <stdint.h> 9*6777b538SAndroid Build Coastguard Worker #include <sys/types.h> 10*6777b538SAndroid Build Coastguard Worker 11*6777b538SAndroid Build Coastguard Worker #include <compare> 12*6777b538SAndroid Build Coastguard Worker #include <iosfwd> 13*6777b538SAndroid Build Coastguard Worker 14*6777b538SAndroid Build Coastguard Worker #include "base/base_export.h" 15*6777b538SAndroid Build Coastguard Worker #include "build/build_config.h" 16*6777b538SAndroid Build Coastguard Worker 17*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN) 18*6777b538SAndroid Build Coastguard Worker #include "base/win/windows_types.h" 19*6777b538SAndroid Build Coastguard Worker #endif 20*6777b538SAndroid Build Coastguard Worker 21*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_FUCHSIA) 22*6777b538SAndroid Build Coastguard Worker #include <zircon/types.h> 23*6777b538SAndroid Build Coastguard Worker #endif 24*6777b538SAndroid Build Coastguard Worker 25*6777b538SAndroid Build Coastguard Worker namespace base { 26*6777b538SAndroid Build Coastguard Worker 27*6777b538SAndroid Build Coastguard Worker class FilePath; 28*6777b538SAndroid Build Coastguard Worker 29*6777b538SAndroid Build Coastguard Worker // ProcessHandle is a platform specific type which represents the underlying OS 30*6777b538SAndroid Build Coastguard Worker // handle to a process. 31*6777b538SAndroid Build Coastguard Worker // ProcessId is a number which identifies the process in the OS. 32*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN) 33*6777b538SAndroid Build Coastguard Worker typedef HANDLE ProcessHandle; 34*6777b538SAndroid Build Coastguard Worker typedef DWORD ProcessId; 35*6777b538SAndroid Build Coastguard Worker typedef HANDLE UserTokenHandle; 36*6777b538SAndroid Build Coastguard Worker const ProcessHandle kNullProcessHandle = NULL; 37*6777b538SAndroid Build Coastguard Worker const ProcessId kNullProcessId = 0; 38*6777b538SAndroid Build Coastguard Worker #elif BUILDFLAG(IS_FUCHSIA) 39*6777b538SAndroid Build Coastguard Worker typedef zx_handle_t ProcessHandle; 40*6777b538SAndroid Build Coastguard Worker typedef zx_koid_t ProcessId; 41*6777b538SAndroid Build Coastguard Worker const ProcessHandle kNullProcessHandle = ZX_HANDLE_INVALID; 42*6777b538SAndroid Build Coastguard Worker const ProcessId kNullProcessId = ZX_KOID_INVALID; 43*6777b538SAndroid Build Coastguard Worker #elif BUILDFLAG(IS_POSIX) 44*6777b538SAndroid Build Coastguard Worker // On POSIX, our ProcessHandle will just be the PID. 45*6777b538SAndroid Build Coastguard Worker typedef pid_t ProcessHandle; 46*6777b538SAndroid Build Coastguard Worker typedef pid_t ProcessId; 47*6777b538SAndroid Build Coastguard Worker const ProcessHandle kNullProcessHandle = 0; 48*6777b538SAndroid Build Coastguard Worker const ProcessId kNullProcessId = 0; 49*6777b538SAndroid Build Coastguard Worker #endif // BUILDFLAG(IS_WIN) 50*6777b538SAndroid Build Coastguard Worker 51*6777b538SAndroid Build Coastguard Worker // To print ProcessIds portably use CrPRIdPid (based on PRIuS and friends from 52*6777b538SAndroid Build Coastguard Worker // C99 and format_macros.h) like this: 53*6777b538SAndroid Build Coastguard Worker // base::StringPrintf("PID is %" CrPRIdPid ".\n", pid); 54*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_FUCHSIA) 55*6777b538SAndroid Build Coastguard Worker #define CrPRIdPid "ld" 56*6777b538SAndroid Build Coastguard Worker #else 57*6777b538SAndroid Build Coastguard Worker #define CrPRIdPid "d" 58*6777b538SAndroid Build Coastguard Worker #endif 59*6777b538SAndroid Build Coastguard Worker 60*6777b538SAndroid Build Coastguard Worker class UniqueProcId { 61*6777b538SAndroid Build Coastguard Worker public: UniqueProcId(ProcessId value)62*6777b538SAndroid Build Coastguard Worker explicit UniqueProcId(ProcessId value) : value_(value) {} 63*6777b538SAndroid Build Coastguard Worker UniqueProcId(const UniqueProcId& other) = default; 64*6777b538SAndroid Build Coastguard Worker UniqueProcId& operator=(const UniqueProcId& other) = default; 65*6777b538SAndroid Build Coastguard Worker 66*6777b538SAndroid Build Coastguard Worker // Returns the process PID. WARNING: On some platforms, the pid may not be 67*6777b538SAndroid Build Coastguard Worker // valid within the current process sandbox. GetUnsafeValue()68*6777b538SAndroid Build Coastguard Worker ProcessId GetUnsafeValue() const { return value_; } 69*6777b538SAndroid Build Coastguard Worker 70*6777b538SAndroid Build Coastguard Worker friend bool operator==(const UniqueProcId&, const UniqueProcId&) = default; 71*6777b538SAndroid Build Coastguard Worker friend auto operator<=>(const UniqueProcId&, const UniqueProcId&) = default; 72*6777b538SAndroid Build Coastguard Worker 73*6777b538SAndroid Build Coastguard Worker private: 74*6777b538SAndroid Build Coastguard Worker ProcessId value_; 75*6777b538SAndroid Build Coastguard Worker }; 76*6777b538SAndroid Build Coastguard Worker 77*6777b538SAndroid Build Coastguard Worker std::ostream& operator<<(std::ostream& os, const UniqueProcId& obj); 78*6777b538SAndroid Build Coastguard Worker 79*6777b538SAndroid Build Coastguard Worker // Returns the id of the current process. 80*6777b538SAndroid Build Coastguard Worker // Note that on some platforms, this is not guaranteed to be unique across 81*6777b538SAndroid Build Coastguard Worker // processes (use GetUniqueIdForProcess if uniqueness is required). 82*6777b538SAndroid Build Coastguard Worker BASE_EXPORT ProcessId GetCurrentProcId(); 83*6777b538SAndroid Build Coastguard Worker 84*6777b538SAndroid Build Coastguard Worker // Returns a unique ID for the current process. The ID will be unique across all 85*6777b538SAndroid Build Coastguard Worker // currently running processes within the chrome session, but IDs of terminated 86*6777b538SAndroid Build Coastguard Worker // processes may be reused. 87*6777b538SAndroid Build Coastguard Worker BASE_EXPORT UniqueProcId GetUniqueIdForProcess(); 88*6777b538SAndroid Build Coastguard Worker 89*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) 90*6777b538SAndroid Build Coastguard Worker // When a process is started in a different PID namespace from the browser 91*6777b538SAndroid Build Coastguard Worker // process, this function must be called with the process's PID in the browser's 92*6777b538SAndroid Build Coastguard Worker // PID namespace in order to initialize its unique ID. Not thread safe. 93*6777b538SAndroid Build Coastguard Worker // WARNING: To avoid inconsistent results from GetUniqueIdForProcess, this 94*6777b538SAndroid Build Coastguard Worker // should only be called very early after process startup - ideally as soon 95*6777b538SAndroid Build Coastguard Worker // after process creation as possible. 96*6777b538SAndroid Build Coastguard Worker BASE_EXPORT void InitUniqueIdForProcessInPidNamespace( 97*6777b538SAndroid Build Coastguard Worker ProcessId pid_outside_of_namespace); 98*6777b538SAndroid Build Coastguard Worker #endif 99*6777b538SAndroid Build Coastguard Worker 100*6777b538SAndroid Build Coastguard Worker // Returns the ProcessHandle of the current process. 101*6777b538SAndroid Build Coastguard Worker BASE_EXPORT ProcessHandle GetCurrentProcessHandle(); 102*6777b538SAndroid Build Coastguard Worker 103*6777b538SAndroid Build Coastguard Worker // Returns the process ID for the specified process. This is functionally the 104*6777b538SAndroid Build Coastguard Worker // same as Windows' GetProcessId(), but works on versions of Windows before Win 105*6777b538SAndroid Build Coastguard Worker // XP SP1 as well. 106*6777b538SAndroid Build Coastguard Worker // DEPRECATED. New code should be using Process::Pid() instead. 107*6777b538SAndroid Build Coastguard Worker // Note that on some platforms, this is not guaranteed to be unique across 108*6777b538SAndroid Build Coastguard Worker // processes. 109*6777b538SAndroid Build Coastguard Worker BASE_EXPORT ProcessId GetProcId(ProcessHandle process); 110*6777b538SAndroid Build Coastguard Worker 111*6777b538SAndroid Build Coastguard Worker #if !BUILDFLAG(IS_FUCHSIA) 112*6777b538SAndroid Build Coastguard Worker // Returns the ID for the parent of the given process. Not available on Fuchsia. 113*6777b538SAndroid Build Coastguard Worker // Returning a negative value indicates an error, such as if the |process| does 114*6777b538SAndroid Build Coastguard Worker // not exist. Returns 0 when |process| has no parent process. 115*6777b538SAndroid Build Coastguard Worker BASE_EXPORT ProcessId GetParentProcessId(ProcessHandle process); 116*6777b538SAndroid Build Coastguard Worker #endif // !BUILDFLAG(IS_FUCHSIA) 117*6777b538SAndroid Build Coastguard Worker 118*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_POSIX) 119*6777b538SAndroid Build Coastguard Worker // Returns the path to the executable of the given process. 120*6777b538SAndroid Build Coastguard Worker BASE_EXPORT FilePath GetProcessExecutablePath(ProcessHandle process); 121*6777b538SAndroid Build Coastguard Worker #endif 122*6777b538SAndroid Build Coastguard Worker 123*6777b538SAndroid Build Coastguard Worker } // namespace base 124*6777b538SAndroid Build Coastguard Worker 125*6777b538SAndroid Build Coastguard Worker #endif // BASE_PROCESS_PROCESS_HANDLE_H_ 126