mirror of https://gitee.com/bigwinds/arangodb
issue #1313: escape whitespace in process name when scanning /proc/pid/stats
This fixes statistics values read from that file
This commit is contained in:
parent
90cc290f7f
commit
30ef155b16
|
@ -739,14 +739,13 @@ TRI_process_info_t TRI_ProcessInfoSelf () {
|
||||||
#ifdef TRI_HAVE_LINUX_PROC
|
#ifdef TRI_HAVE_LINUX_PROC
|
||||||
|
|
||||||
TRI_process_info_t TRI_ProcessInfo (TRI_pid_t pid) {
|
TRI_process_info_t TRI_ProcessInfo (TRI_pid_t pid) {
|
||||||
char fn[1024];
|
|
||||||
int fd;
|
|
||||||
TRI_process_info_t result;
|
TRI_process_info_t result;
|
||||||
|
|
||||||
memset(&result, 0, sizeof(result));
|
memset(&result, 0, sizeof(result));
|
||||||
|
|
||||||
|
char fn[1024];
|
||||||
snprintf(fn, sizeof(fn), "/proc/%d/stat", pid);
|
snprintf(fn, sizeof(fn), "/proc/%d/stat", pid);
|
||||||
fd = open(fn, O_RDONLY);
|
|
||||||
|
int fd = open(fn, O_RDONLY);
|
||||||
|
|
||||||
if (fd >= 0) {
|
if (fd >= 0) {
|
||||||
char str[1024];
|
char str[1024];
|
||||||
|
@ -761,6 +760,33 @@ TRI_process_info_t TRI_ProcessInfo (TRI_pid_t pid) {
|
||||||
if (n == 0) {
|
if (n == 0) {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// fix process name in buffer. sadly, the process name might contain whitespace
|
||||||
|
// and the sscanf format '%s' will not honor that
|
||||||
|
char* p = &str[0];
|
||||||
|
char* e = p + n;
|
||||||
|
// first skip over the process id at the start of the string
|
||||||
|
while (*p != '\0' && p < e && *p != ' ') {
|
||||||
|
++p;
|
||||||
|
}
|
||||||
|
// skip space
|
||||||
|
if (p < e && *p == ' ') {
|
||||||
|
++p;
|
||||||
|
}
|
||||||
|
// check if filename is contained in parentheses
|
||||||
|
if (p < e && *p == '(') {
|
||||||
|
// yes
|
||||||
|
++p;
|
||||||
|
// now replace all whitespace within the process name with underscores
|
||||||
|
// otherwise the sscanf below will happily parse the string incorrectly
|
||||||
|
while (p < e && *p != '0' && *p != ')') {
|
||||||
|
if (*p == ' ') {
|
||||||
|
*p = '_';
|
||||||
|
}
|
||||||
|
++p;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
sscanf(str, "%d %s %c %d %d %d %d %d %u %lu %lu %lu %lu %lu %lu %ld %ld %ld %ld %ld %ld %llu %lu %ld",
|
sscanf(str, "%d %s %c %d %d %d %d %d %u %lu %lu %lu %lu %lu %lu %ld %ld %ld %ld %ld %ld %llu %lu %ld",
|
||||||
&st.pid, (char*) &st.comm, &st.state, &st.ppid, &st.pgrp, &st.session, &st.tty_nr, &st.tpgid,
|
&st.pid, (char*) &st.comm, &st.state, &st.ppid, &st.pgrp, &st.session, &st.tty_nr, &st.tpgid,
|
||||||
&st.flags, &st.minflt, &st.cminflt, &st.majflt, &st.cmajflt, &st.utime, &st.stime,
|
&st.flags, &st.minflt, &st.cminflt, &st.majflt, &st.cmajflt, &st.utime, &st.stime,
|
||||||
|
|
Loading…
Reference in New Issue