From: hyunuktak Date: Fri, 15 Sep 2017 02:04:23 +0000 (+0900) Subject: Get process status from procfs X-Git-Tag: accepted/tizen/unified/20170920.081237~1 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=832d05fa4a9c9583cde9105623cc59d0e0fcc712;p=platform%2Fcore%2Fconnectivity%2Fstc-manager.git Get process status from procfs Change-Id: I8c9916ce129ec35f0f93d4d3c35afc0e67f3b7f1 Signed-off-by: hyunuktak --- diff --git a/include/stc-manager-util.h b/include/stc-manager-util.h index d5ee410..32b1cde 100755 --- a/include/stc-manager-util.h +++ b/include/stc-manager-util.h @@ -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 "," diff --git a/src/helper/helper-procfs.c b/src/helper/helper-procfs.c old mode 100644 new mode 100755 index 0974f2a..ca291ac --- a/src/helper/helper-procfs.c +++ b/src/helper/helper-procfs.c @@ -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; } diff --git a/src/helper/helper-procfs.h b/src/helper/helper-procfs.h old mode 100644 new mode 100755 index 4f0fd02..55c6a03 --- a/src/helper/helper-procfs.h +++ b/src/helper/helper-procfs.h @@ -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__*/ diff --git a/src/monitor/stc-app-lifecycle.c b/src/monitor/stc-app-lifecycle.c index 829c989..7f5e035 100755 --- a/src/monitor/stc-app-lifecycle.c +++ b/src/monitor/stc-app-lifecycle.c @@ -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]); } }