1 /* 2 * virprocess.h: interaction with processes 3 * 4 * Copyright (C) 2010-2015 Red Hat, Inc. 5 * 6 * This library is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU Lesser General Public 8 * License as published by the Free Software Foundation; either 9 * version 2.1 of the License, or (at your option) any later version. 10 * 11 * This library is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 * Lesser General Public License for more details. 15 * 16 * You should have received a copy of the GNU Lesser General Public 17 * License along with this library. If not, see 18 * <http://www.gnu.org/licenses/>. 19 * 20 */ 21 22 #pragma once 23 24 #include <sys/types.h> 25 26 #include "internal.h" 27 #include "virbitmap.h" 28 #include "virenum.h" 29 30 typedef enum { 31 VIR_PROC_POLICY_NONE = 0, 32 VIR_PROC_POLICY_BATCH, 33 VIR_PROC_POLICY_IDLE, 34 VIR_PROC_POLICY_FIFO, 35 VIR_PROC_POLICY_RR, 36 37 VIR_PROC_POLICY_LAST 38 } virProcessSchedPolicy; 39 40 VIR_ENUM_DECL(virProcessSchedPolicy); 41 42 char * 43 virProcessTranslateStatus(int status); 44 45 void 46 virProcessAbort(pid_t pid); 47 48 void virProcessExitWithStatus(int status) G_GNUC_NORETURN; 49 50 int 51 virProcessWait(pid_t pid, int *exitstatus, bool raw) 52 G_GNUC_WARN_UNUSED_RESULT; 53 54 int virProcessKill(pid_t pid, int sig); 55 int virProcessGroupKill(pid_t pid, int sig); 56 pid_t virProcessGroupGet(pid_t pid); 57 58 int virProcessKillPainfully(pid_t pid, bool force); 59 int virProcessKillPainfullyDelay(pid_t pid, 60 bool force, 61 unsigned int extradelay, 62 bool group); 63 64 int virProcessSetAffinity(pid_t pid, virBitmap *map, bool quiet); 65 66 virBitmap *virProcessGetAffinity(pid_t pid); 67 68 int virProcessGetPids(pid_t pid, size_t *npids, pid_t **pids); 69 70 int virProcessGetStartTime(pid_t pid, 71 unsigned long long *timestamp); 72 73 int virProcessGetNamespaces(pid_t pid, 74 size_t *nfdlist, 75 int **fdlist); 76 77 int virProcessSetNamespaces(size_t nfdlist, 78 int *fdlist); 79 80 int virProcessSetMaxMemLock(pid_t pid, unsigned long long bytes) G_GNUC_NO_INLINE; 81 int virProcessSetMaxProcesses(pid_t pid, unsigned int procs); 82 int virProcessSetMaxFiles(pid_t pid, unsigned int files); 83 int virProcessSetMaxCoreSize(pid_t pid, unsigned long long bytes); 84 85 int virProcessGetMaxMemLock(pid_t pid, unsigned long long *bytes) G_GNUC_NO_INLINE; 86 87 /* Callback to run code within the mount namespace tied to the given 88 * pid. This function must use only async-signal-safe functions, as 89 * it gets run after a fork of a multi-threaded process. The return 90 * value of this function is passed to _exit(), except that a 91 * negative value is treated as EXIT_CANCELED. */ 92 typedef int (*virProcessNamespaceCallback)(pid_t pid, void *opaque); 93 94 int virProcessRunInMountNamespace(pid_t pid, 95 virProcessNamespaceCallback cb, 96 void *opaque); 97 98 /** 99 * virProcessForkCallback: 100 * @ppid: parent's pid 101 * @opaque: opaque data 102 * 103 * Callback to run in fork()-ed process. 104 * 105 * Returns: 0 on success, 106 * -1 on error (treated as EXIT_CANCELED) 107 */ 108 typedef int (*virProcessForkCallback)(pid_t ppid, 109 void *opaque); 110 111 int virProcessRunInFork(virProcessForkCallback cb, 112 void *opaque) 113 G_GNUC_NO_INLINE; 114 115 int virProcessSetupPrivateMountNS(void); 116 117 int virProcessSetScheduler(pid_t pid, 118 virProcessSchedPolicy policy, 119 int priority); 120 121 GStrv virProcessGetStat(pid_t pid, pid_t tid); 122 123 /* These constants are modelled after proc(5) */ 124 enum { 125 VIR_PROCESS_STAT_PID, 126 VIR_PROCESS_STAT_COMM, 127 VIR_PROCESS_STAT_STATE, 128 VIR_PROCESS_STAT_PPID, 129 VIR_PROCESS_STAT_PGRP, 130 VIR_PROCESS_STAT_SESSION, 131 VIR_PROCESS_STAT_TTY_NR, 132 VIR_PROCESS_STAT_TPGID, 133 VIR_PROCESS_STAT_FLAGS, 134 VIR_PROCESS_STAT_MINFLT, 135 VIR_PROCESS_STAT_CMINFLT, 136 VIR_PROCESS_STAT_MAJFLT, 137 VIR_PROCESS_STAT_CMAJFLT, 138 VIR_PROCESS_STAT_UTIME, 139 VIR_PROCESS_STAT_STIME, 140 VIR_PROCESS_STAT_CUTIME, 141 VIR_PROCESS_STAT_CSTIME, 142 VIR_PROCESS_STAT_PRIORITY, 143 VIR_PROCESS_STAT_NICE, 144 VIR_PROCESS_STAT_NUM_THREADS, 145 VIR_PROCESS_STAT_ITREALVALUE, 146 VIR_PROCESS_STAT_STARTTIME, 147 VIR_PROCESS_STAT_VSIZE, 148 VIR_PROCESS_STAT_RSS, 149 VIR_PROCESS_STAT_RSSLIM, 150 VIR_PROCESS_STAT_STARTCODE, 151 VIR_PROCESS_STAT_ENDCODE, 152 VIR_PROCESS_STAT_STARTSTACK, 153 VIR_PROCESS_STAT_KSTKESP, 154 VIR_PROCESS_STAT_KSTKEIP, 155 VIR_PROCESS_STAT_SIGNAL, 156 VIR_PROCESS_STAT_BLOCKED, 157 VIR_PROCESS_STAT_SIGIGNORE, 158 VIR_PROCESS_STAT_SIGCATCH, 159 VIR_PROCESS_STAT_WCHAN, 160 VIR_PROCESS_STAT_NSWAP, 161 VIR_PROCESS_STAT_CNSWAP, 162 VIR_PROCESS_STAT_EXIT_SIGNAL, 163 VIR_PROCESS_STAT_PROCESSOR, 164 VIR_PROCESS_STAT_RT_PRIORITY, 165 VIR_PROCESS_STAT_POLICY, 166 VIR_PROCESS_STAT_DELAYACCT_BLKIO_TICKS, 167 VIR_PROCESS_STAT_GUEST_TIME, 168 VIR_PROCESS_STAT_CGUEST_TIME, 169 VIR_PROCESS_STAT_START_DATA, 170 VIR_PROCESS_STAT_END_DATA, 171 VIR_PROCESS_STAT_START_BRK, 172 VIR_PROCESS_STAT_ARG_START, 173 VIR_PROCESS_STAT_ARG_END, 174 VIR_PROCESS_STAT_ENV_START, 175 VIR_PROCESS_STAT_ENV_END, 176 VIR_PROCESS_STAT_EXIT_CODE, 177 }; 178 179 /* 180 * At the time of writing there are 52 values reported in /proc/.../stat, the 181 * line below checks that the last one has the right value, increase accordingly 182 * based on proc(5) whenever adding new fields. 183 */ 184 G_STATIC_ASSERT(VIR_PROCESS_STAT_EXIT_CODE == 51); 185 186 typedef enum { 187 VIR_PROCESS_NAMESPACE_MNT = (1 << 1), 188 VIR_PROCESS_NAMESPACE_IPC = (1 << 2), 189 VIR_PROCESS_NAMESPACE_NET = (1 << 3), 190 VIR_PROCESS_NAMESPACE_PID = (1 << 4), 191 VIR_PROCESS_NAMESPACE_USER = (1 << 5), 192 VIR_PROCESS_NAMESPACE_UTS = (1 << 6), 193 } virProcessNamespaceFlags; 194 195 int virProcessNamespaceAvailable(unsigned int ns); 196