Get process status from procfs 39/150239/2
authorhyunuktak <hyunuk.tak@samsung.com>
Fri, 15 Sep 2017 02:04:23 +0000 (11:04 +0900)
committerhyunuktak <hyunuk.tak@samsung.com>
Fri, 15 Sep 2017 03:59:11 +0000 (12:59 +0900)
Change-Id: I8c9916ce129ec35f0f93d4d3c35afc0e67f3b7f1
Signed-off-by: hyunuktak <hyunuk.tak@samsung.com>
include/stc-manager-util.h
src/helper/helper-procfs.c [changed mode: 0644->0755]
src/helper/helper-procfs.h [changed mode: 0644->0755]
src/monitor/stc-app-lifecycle.c

index d5ee410..32b1cde 100755 (executable)
@@ -321,6 +321,14 @@ static inline bool strstart_with(const char *str, const char *with)
 
 #define PROC_BUF_MAX 64
 #define PROC_NAME_MAX 1024
+#define PROC_STATUS_CNT 6
+
+#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 COMMA_DELIMETER ","
 
old mode 100644 (file)
new mode 100755 (executable)
index 0974f2a..ca291ac
@@ -157,9 +157,38 @@ int proc_get_raw_cmdline(pid_t pid, char *buf, int len)
        return proc_get_data(path, buf, len);
 }
 
-int proc_get_status(pid_t pid, char *buf, int len)
+int proc_get_status(pid_t pid, char status[][PROC_BUF_MAX])
 {
+       unsigned int i;
        char path[PROC_BUF_MAX];
+       char status_buf[PROC_BUF_MAX];
+       FILE *fp;
+
        snprintf(path, sizeof(path), "/proc/%d/status", pid);
-       return proc_get_data(path, buf, len);
+       fp = fopen(path, "r");
+       if (fp == NULL)
+               return STC_ERROR_FAIL;
+
+       for (i = 0; i < PROC_STATUS_CNT; ++i) {
+               char *token = NULL;
+               char *saveptr = NULL;
+
+               if (fgets(status_buf, sizeof(status_buf), fp) == NULL) {
+                       fclose(fp);
+                       return STC_ERROR_FAIL;
+               }
+
+               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]));
+                       }
+               }
+       }
+       fclose(fp);
+
+       return STC_ERROR_NONE;
 }
old mode 100644 (file)
new mode 100755 (executable)
index 4f0fd02..55c6a03
@@ -58,6 +58,6 @@ int proc_get_exepath(pid_t pid, char *buf, int len);
  * @desc get status from /proc/{pid}/status
  * @return negative value if error
  */
-int proc_get_status(pid_t pid, char *buf, int len);
+int proc_get_status(pid_t pid, char status[][PROC_BUF_MAX]);
 
 #endif /*__HELPER_PROCFS_H__*/
index 829c989..7f5e035 100755 (executable)
@@ -37,7 +37,7 @@ typedef struct {
 
 typedef struct {
        char cmdline[PROC_NAME_MAX];
-       char status[PROC_BUF_MAX];
+       char status[PROC_STATUS_CNT][PROC_BUF_MAX];
 } proc_value_s;
 
 typedef struct __attribute__ ((aligned(NLMSG_ALIGNTO))) {
@@ -317,16 +317,17 @@ stc_error_e stc_manager_app_status_changed(stc_cmd_type_e cmd,
 static void __process_event_exec(int tid, int pid)
 {
        char cmdline[PROC_NAME_MAX] = {0, };
-       char status[PROC_BUF_MAX] = {0, };
+       char status[PROC_STATUS_CNT][PROC_BUF_MAX];
 
        if (STC_ERROR_NONE == proc_get_cmdline(pid, cmdline) &&
-           STC_ERROR_NONE == proc_get_status(pid, status, PROC_BUF_MAX)) {
+           STC_ERROR_NONE == proc_get_status(pid, status)) {
 
                if (__check_excn(cmdline)) {
                        STC_LOGI("[%s] monitoring is excepted", cmdline);
                        return;
                }
 
+               unsigned int i;
                proc_key_s *key;
                proc_value_s *value;
 
@@ -344,13 +345,16 @@ static void __process_event_exec(int tid, int pid)
                }
 
                key->pid = pid;
-               g_strlcpy(value->status, status, sizeof(value->status));
+               for (i = 0; i < PROC_STATUS_CNT; ++i)
+                       g_strlcpy(value->status[i], status[i], sizeof(value->status[i]));
                g_strlcpy(value->cmdline, cmdline, sizeof(value->cmdline));
 
                __proc_tree_add(key, value);
 
-               STC_LOGD("EXEC:pid=%d,tgid=%d\t[%s]\t[%s]", pid, tid, status,
-                        cmdline);
+               STC_LOGD("EXEC: pid[%d] tgid=[%d] cmdline[%s]", pid, tid, cmdline);
+               STC_LOGD("STATUS: name[%s] state[%s] tgid[%s] pid[%s] ppid[%s] tracerpid[%s]",
+                       status[PROC_STATUS_NAME], status[PROC_STATUS_STATE], status[PROC_STATUS_TGID],
+                       status[PROC_STATUS_PID], status[PROC_STATUS_PPID], status[PROC_STATUS_TRACERPID]);
        }
 }