#define PROC_BUF_MAX 64
#define PROC_NAME_MAX 1024
-#define PROC_STATUS_CNT 6
+#define PROC_STATUS_CNT 7
#define PROC_STATUS_NAME 0
#define PROC_STATUS_STATE 1
#define PROC_STATUS_TGID 2
-#define PROC_STATUS_PID 3
-#define PROC_STATUS_PPID 4
-#define PROC_STATUS_TRACERPID 5
+#define PROC_STATUS_NGID 3
+#define PROC_STATUS_PID 4
+#define PROC_STATUS_PPID 5
+#define PROC_STATUS_TRACERPID 6
+
+#define PROC_STATUS_NAME_STR "Name:"
+#define PROC_STATUS_STATE_STR "State:"
+#define PROC_STATUS_TGID_STR "Tgid:"
+#define PROC_STATUS_NGID_STR "Ngid:"
+#define PROC_STATUS_PID_STR "Pid:"
+#define PROC_STATUS_PPID_STR "PPid:"
+#define PROC_STATUS_TRACERPID_STR "TracerPid:"
#define COMMA_DELIMETER ","
int proc_get_status(pid_t pid, char status[][PROC_BUF_MAX])
{
unsigned int i;
+ unsigned int index = 0;
char path[PROC_BUF_MAX];
char status_buf[PROC_BUF_MAX];
+ bool updated[PROC_STATUS_CNT] = {FALSE, };
FILE *fp;
snprintf(path, sizeof(path), "/proc/%d/status", pid);
return STC_ERROR_FAIL;
}
+ if (!updated[PROC_STATUS_NAME] && strstr(status_buf,
+ PROC_STATUS_NAME_STR))
+ index = PROC_STATUS_NAME;
+ else if (!updated[PROC_STATUS_STATE] && strstr(status_buf,
+ PROC_STATUS_STATE_STR))
+ index = PROC_STATUS_STATE;
+ else if (!updated[PROC_STATUS_TGID] && strstr(status_buf,
+ PROC_STATUS_TGID_STR))
+ index = PROC_STATUS_TGID;
+ else if (!updated[PROC_STATUS_NGID] && strstr(status_buf,
+ PROC_STATUS_NGID_STR))
+ index = PROC_STATUS_NGID;
+ else if (!updated[PROC_STATUS_PID] && strstr(status_buf,
+ PROC_STATUS_PID_STR))
+ index = PROC_STATUS_PID;
+ else if (!updated[PROC_STATUS_PPID] && strstr(status_buf,
+ PROC_STATUS_PPID_STR))
+ index = PROC_STATUS_PPID;
+ else if (!updated[PROC_STATUS_TRACERPID] && strstr(status_buf,
+ PROC_STATUS_TRACERPID_STR))
+ index = PROC_STATUS_TRACERPID;
+ else
+ continue;
+
token = strtok_r(status_buf, ":", &saveptr);
if (token != NULL) {
token = strtok_r(NULL, "\n", &saveptr);
if (token != NULL) {
while (isspace((unsigned char)*token))
token++;
- strncpy(status[i], token, sizeof(status[i]));
+ strncpy(status[index], token,
+ sizeof(status[index]));
+ updated[index] = TRUE;
}
}
}
char cmdline[PROC_NAME_MAX] = {0, };
char status[PROC_STATUS_CNT][PROC_BUF_MAX];
+ memset(status, 0x0, sizeof(status));
+
if (STC_ERROR_NONE == proc_get_cmdline(pid, cmdline) &&
STC_ERROR_NONE == proc_get_status(pid, status)) {
char cmdline[PROC_NAME_MAX] = {0, };
char status[PROC_STATUS_CNT][PROC_BUF_MAX];
+ memset(status, 0x0, sizeof(status));
+
if (STC_ERROR_NONE == proc_get_cmdline(pid, cmdline) &&
STC_ERROR_NONE == proc_get_status(pid, status)) {