121 // utime (14), stime(15), starttime(22)
122 if (4 != sscanf(s, " %*c %d %*d %*d %*d %*d %*d %*u %*u %*u %*u %lu %lu %*d %*d %*d %*d %*d %*d %llu",
123 &parentPid, &utime, &stime, &start)) {
124 return 0; // not all values parsed; return error
125 }
126
127 *totalTime = (utime + stime) * (jlong)(1000000000 / clock_ticks_per_second);
128
129 *startTime = bootTime_ms + ((start * 1000) / clock_ticks_per_second);
130
131 return parentPid;
132 }
133
134 void os_getCmdlineAndUserInfo(JNIEnv *env, jobject jinfo, pid_t pid) {
135 int fd;
136 int cmdlen = 0;
137 char *cmdline = NULL, *cmdEnd = NULL; // used for command line args and exe
138 char *args = NULL;
139 jstring cmdexe = NULL;
140 char fn[32];
141 struct stat stat_buf;
142
143 /*
144 * Stat /proc/<pid> to get the user id
145 */
146 snprintf(fn, sizeof fn, "/proc/%d", pid);
147 if (stat(fn, &stat_buf) == 0) {
148 unix_getUserInfo(env, jinfo, stat_buf.st_uid);
149 JNU_CHECK_EXCEPTION(env);
150 }
151
152 /*
153 * Try to open /proc/<pid>/cmdline
154 */
155 strncat(fn, "/cmdline", sizeof fn - strnlen(fn, sizeof fn) - 1);
156 if ((fd = open(fn, O_RDONLY)) < 0) {
157 return;
158 }
159
160 do { // Block to break out of on errors
161 int i, truncated = 0;
162 int count;
163 char *s;
164
165 /*
166 * The path name read by readlink() is limited to PATH_MAX characters.
167 * The content of /proc/<pid>/cmdline is limited to PAGE_SIZE characters.
|
121 // utime (14), stime(15), starttime(22)
122 if (4 != sscanf(s, " %*c %d %*d %*d %*d %*d %*d %*u %*u %*u %*u %lu %lu %*d %*d %*d %*d %*d %*d %llu",
123 &parentPid, &utime, &stime, &start)) {
124 return 0; // not all values parsed; return error
125 }
126
127 *totalTime = (utime + stime) * (jlong)(1000000000 / clock_ticks_per_second);
128
129 *startTime = bootTime_ms + ((start * 1000) / clock_ticks_per_second);
130
131 return parentPid;
132 }
133
134 void os_getCmdlineAndUserInfo(JNIEnv *env, jobject jinfo, pid_t pid) {
135 int fd;
136 int cmdlen = 0;
137 char *cmdline = NULL, *cmdEnd = NULL; // used for command line args and exe
138 char *args = NULL;
139 jstring cmdexe = NULL;
140 char fn[32];
141 struct stat64 stat_buf;
142
143 /*
144 * Stat /proc/<pid> to get the user id
145 */
146 snprintf(fn, sizeof fn, "/proc/%d", pid);
147 if (stat64(fn, &stat_buf) == 0) {
148 unix_getUserInfo(env, jinfo, stat_buf.st_uid);
149 JNU_CHECK_EXCEPTION(env);
150 }
151
152 /*
153 * Try to open /proc/<pid>/cmdline
154 */
155 strncat(fn, "/cmdline", sizeof fn - strnlen(fn, sizeof fn) - 1);
156 if ((fd = open(fn, O_RDONLY)) < 0) {
157 return;
158 }
159
160 do { // Block to break out of on errors
161 int i, truncated = 0;
162 int count;
163 char *s;
164
165 /*
166 * The path name read by readlink() is limited to PATH_MAX characters.
167 * The content of /proc/<pid>/cmdline is limited to PAGE_SIZE characters.
|