/* * Return process uids/gids as a Python tuple. */ static PyObject * psutil_proc_num_ctx_switches(PyObject *self, PyObject *args) { int pid; char path[100]; prusage_t info; if (! PyArg_ParseTuple(args, "i", &pid)) return NULL; sprintf(path, "/proc/%i/usage", pid); if (! psutil_file_to_struct(path, (void *)&info, sizeof(info))) return NULL; return Py_BuildValue("kk", info.pr_vctx, info.pr_ictx); }
/* * Return process name and args as a Python tuple. */ static PyObject * psutil_proc_name_and_args(PyObject *self, PyObject *args) { int pid; char path[100]; psinfo_t info; if (! PyArg_ParseTuple(args, "i", &pid)) return NULL; sprintf(path, "/proc/%i/psinfo", pid); if (! psutil_file_to_struct(path, (void *)&info, sizeof(info))) return NULL; return Py_BuildValue("ss", info.pr_fname, info.pr_psargs); }
/* * Return information about a given process thread. */ static PyObject * psutil_proc_query_thread(PyObject *self, PyObject *args) { int pid, tid; char path[100]; lwpstatus_t info; if (! PyArg_ParseTuple(args, "ii", &pid, &tid)) return NULL; sprintf(path, "/proc/%i/lwp/%i/lwpstatus", pid, tid); if (! psutil_file_to_struct(path, (void *)&info, sizeof(info))) return NULL; return Py_BuildValue("dd", TV2DOUBLE(info.pr_utime), TV2DOUBLE(info.pr_stime)); }
/* * Return process uids/gids as a Python tuple. */ static PyObject * psutil_proc_cred(PyObject *self, PyObject *args) { int pid; char path[100]; prcred_t info; if (! PyArg_ParseTuple(args, "i", &pid)) return NULL; sprintf(path, "/proc/%i/cred", pid); if (! psutil_file_to_struct(path, (void *)&info, sizeof(info))) return NULL; return Py_BuildValue("iiiiii", info.pr_ruid, info.pr_euid, info.pr_suid, info.pr_rgid, info.pr_egid, info.pr_sgid); }
/* * Return process user and system CPU times as a Python tuple. */ static PyObject * psutil_proc_cpu_times(PyObject *self, PyObject *args) { int pid; char path[100]; pstatus_t info; if (! PyArg_ParseTuple(args, "i", &pid)) return NULL; sprintf(path, "/proc/%i/status", pid); if (! psutil_file_to_struct(path, (void *)&info, sizeof(info))) return NULL; // results are more precise than os.times() return Py_BuildValue("dd", TV2DOUBLE(info.pr_utime), TV2DOUBLE(info.pr_stime)); }
/* * Return process user and system CPU times as a Python tuple. */ static PyObject * psutil_proc_cpu_times(PyObject *self, PyObject *args) { int pid; char path[1000]; pstatus_t info; const char *procfs_path; if (! PyArg_ParseTuple(args, "is", &pid, &procfs_path)) return NULL; sprintf(path, "%s/%i/status", procfs_path, pid); if (! psutil_file_to_struct(path, (void *)&info, sizeof(info))) return NULL; // results are more precise than os.times() return Py_BuildValue( "(dddd)", PSUTIL_TV2DOUBLE(info.pr_utime), PSUTIL_TV2DOUBLE(info.pr_stime), PSUTIL_TV2DOUBLE(info.pr_cutime), PSUTIL_TV2DOUBLE(info.pr_cstime) ); }
/* * Return process ppid, rss, vms, ctime, nice, nthreads, status and tty * as a Python tuple. */ static PyObject * psutil_proc_basic_info(PyObject *self, PyObject *args) { int pid; char path[100]; psinfo_t info; if (! PyArg_ParseTuple(args, "i", &pid)) return NULL; sprintf(path, "/proc/%i/psinfo", pid); if (! psutil_file_to_struct(path, (void *)&info, sizeof(info))) return NULL; return Py_BuildValue("ikkdiiik", info.pr_ppid, // parent pid info.pr_rssize, // rss info.pr_size, // vms TV2DOUBLE(info.pr_start), // create time info.pr_lwp.pr_nice, // nice info.pr_nlwp, // no. of threads info.pr_lwp.pr_state, // status code info.pr_ttydev // tty nr ); }
/* * Return process memory mappings. */ static PyObject * psutil_proc_memory_maps(PyObject *self, PyObject *args) { int pid; int fd = -1; char path[100]; char perms[10]; char *name; struct stat st; pstatus_t status; prxmap_t *xmap = NULL, *p; off_t size; size_t nread; int nmap; uintptr_t pr_addr_sz; uintptr_t stk_base_sz, brk_base_sz; PyObject *pytuple = NULL; PyObject *py_retlist = PyList_New(0); if (py_retlist == NULL) return NULL; if (! PyArg_ParseTuple(args, "i", &pid)) goto error; sprintf(path, "/proc/%i/status", pid); if (! psutil_file_to_struct(path, (void *)&status, sizeof(status))) goto error; sprintf(path, "/proc/%i/xmap", pid); if (stat(path, &st) == -1) { PyErr_SetFromErrno(PyExc_OSError); goto error; } size = st.st_size; fd = open(path, O_RDONLY); if (fd == -1) { PyErr_SetFromErrno(PyExc_OSError); goto error; } xmap = (prxmap_t *)malloc(size); if (xmap == NULL) { PyErr_NoMemory(); goto error; } nread = pread(fd, xmap, size, 0); nmap = nread / sizeof(prxmap_t); p = xmap; while (nmap) { nmap -= 1; if (p == NULL) { p += 1; continue; } perms[0] = '\0'; pr_addr_sz = p->pr_vaddr + p->pr_size; // perms sprintf(perms, "%c%c%c%c%c%c", p->pr_mflags & MA_READ ? 'r' : '-', p->pr_mflags & MA_WRITE ? 'w' : '-', p->pr_mflags & MA_EXEC ? 'x' : '-', p->pr_mflags & MA_SHARED ? 's' : '-', p->pr_mflags & MA_NORESERVE ? 'R' : '-', p->pr_mflags & MA_RESERVED1 ? '*' : ' '); // name if (strlen(p->pr_mapname) > 0) { name = p->pr_mapname; } else { if ((p->pr_mflags & MA_ISM) || (p->pr_mflags & MA_SHM)) { name = "[shmid]"; } else { stk_base_sz = status.pr_stkbase + status.pr_stksize; brk_base_sz = status.pr_brkbase + status.pr_brksize; if ((pr_addr_sz > status.pr_stkbase) && (p->pr_vaddr < stk_base_sz)) { name = "[stack]"; } else if ((p->pr_mflags & MA_ANON) && \ (pr_addr_sz > status.pr_brkbase) && \ (p->pr_vaddr < brk_base_sz)) { name = "[heap]"; } else { name = "[anon]"; } } } pytuple = Py_BuildValue("iisslll", p->pr_vaddr, pr_addr_sz, perms, name, (long)p->pr_rss * p->pr_pagesize, (long)p->pr_anon * p->pr_pagesize, (long)p->pr_locked * p->pr_pagesize); if (!pytuple) goto error; if (PyList_Append(py_retlist, pytuple)) goto error; Py_DECREF(pytuple); // increment pointer p += 1; } close(fd); free(xmap); return py_retlist; error: if (fd != -1) close(fd); Py_XDECREF(pytuple); Py_DECREF(py_retlist); if (xmap != NULL) free(xmap); return NULL; }
/* * Return process environ block. */ static PyObject * psutil_proc_environ(PyObject *self, PyObject *args) { int pid; char path[1000]; psinfo_t info; const char *procfs_path; char **env = NULL; ssize_t env_count = -1; char *dm; int i = 0; PyObject *py_envname = NULL; PyObject *py_envval = NULL; PyObject *py_retdict = PyDict_New(); if (! py_retdict) return PyErr_NoMemory(); if (! PyArg_ParseTuple(args, "is", &pid, &procfs_path)) return NULL; sprintf(path, "%s/%i/psinfo", procfs_path, pid); if (! psutil_file_to_struct(path, (void *)&info, sizeof(info))) goto error; if (! info.pr_envp) { AccessDenied(""); goto error; } env = psutil_read_raw_env(info, procfs_path, &env_count); if (! env && env_count != 0) goto error; for (i=0; i<env_count; i++) { if (! env[i]) break; dm = strchr(env[i], '='); if (! dm) continue; *dm = '\0'; py_envname = PyUnicode_DecodeFSDefault(env[i]); if (! py_envname) goto error; py_envval = PyUnicode_DecodeFSDefault(dm+1); if (! py_envname) goto error; if (PyDict_SetItem(py_retdict, py_envname, py_envval) < 0) goto error; Py_DECREF(py_envname); Py_DECREF(py_envval); } psutil_free_cstrings_array(env, env_count); return py_retdict; error: if (env && env_count >= 0) psutil_free_cstrings_array(env, env_count); Py_XDECREF(py_envname); Py_XDECREF(py_envval); Py_XDECREF(py_retdict); return NULL; }