1dda28197Spatrick //===-- HostProcessPosix.cpp ----------------------------------------------===// 2061da546Spatrick // 3061da546Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4061da546Spatrick // See https://llvm.org/LICENSE.txt for license information. 5061da546Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6061da546Spatrick // 7061da546Spatrick //===----------------------------------------------------------------------===// 8061da546Spatrick 9061da546Spatrick #include "lldb/Host/Host.h" 10061da546Spatrick #include "lldb/Host/FileSystem.h" 11061da546Spatrick #include "lldb/Host/posix/HostProcessPosix.h" 12061da546Spatrick 13061da546Spatrick #include "llvm/ADT/STLExtras.h" 14061da546Spatrick 15be691f3bSpatrick #include <climits> 16061da546Spatrick #include <csignal> 17061da546Spatrick #include <unistd.h> 18061da546Spatrick 19061da546Spatrick using namespace lldb_private; 20061da546Spatrick 21*f6aab3d8Srobert static const int kInvalidPosixProcess = 0; 22061da546Spatrick HostProcessPosix()23061da546SpatrickHostProcessPosix::HostProcessPosix() 24061da546Spatrick : HostNativeProcessBase(kInvalidPosixProcess) {} 25061da546Spatrick HostProcessPosix(lldb::process_t process)26061da546SpatrickHostProcessPosix::HostProcessPosix(lldb::process_t process) 27061da546Spatrick : HostNativeProcessBase(process) {} 28061da546Spatrick 29be691f3bSpatrick HostProcessPosix::~HostProcessPosix() = default; 30061da546Spatrick Signal(int signo) const31061da546SpatrickStatus HostProcessPosix::Signal(int signo) const { 32061da546Spatrick if (m_process == kInvalidPosixProcess) { 33061da546Spatrick Status error; 34061da546Spatrick error.SetErrorString("HostProcessPosix refers to an invalid process"); 35061da546Spatrick return error; 36061da546Spatrick } 37061da546Spatrick 38061da546Spatrick return HostProcessPosix::Signal(m_process, signo); 39061da546Spatrick } 40061da546Spatrick Signal(lldb::process_t process,int signo)41061da546SpatrickStatus HostProcessPosix::Signal(lldb::process_t process, int signo) { 42061da546Spatrick Status error; 43061da546Spatrick 44061da546Spatrick if (-1 == ::kill(process, signo)) 45061da546Spatrick error.SetErrorToErrno(); 46061da546Spatrick 47061da546Spatrick return error; 48061da546Spatrick } 49061da546Spatrick Terminate()50061da546SpatrickStatus HostProcessPosix::Terminate() { return Signal(SIGKILL); } 51061da546Spatrick GetProcessId() const52061da546Spatricklldb::pid_t HostProcessPosix::GetProcessId() const { return m_process; } 53061da546Spatrick IsRunning() const54061da546Spatrickbool HostProcessPosix::IsRunning() const { 55061da546Spatrick if (m_process == kInvalidPosixProcess) 56061da546Spatrick return false; 57061da546Spatrick 58061da546Spatrick // Send this process the null signal. If it succeeds the process is running. 59061da546Spatrick Status error = Signal(0); 60061da546Spatrick return error.Success(); 61061da546Spatrick } 62061da546Spatrick StartMonitoring(const Host::MonitorChildProcessCallback & callback)63061da546Spatrickllvm::Expected<HostThread> HostProcessPosix::StartMonitoring( 64*f6aab3d8Srobert const Host::MonitorChildProcessCallback &callback) { 65*f6aab3d8Srobert return Host::StartMonitoringChildProcess(callback, m_process); 66061da546Spatrick } 67