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