示例#1
0
void
glibtop_get_proc_kernel_s (glibtop *server, glibtop_proc_kernel *buf, pid_t pid)
{
	char buffer [BUFSIZ], *p;

	memset (buf, 0, sizeof (glibtop_proc_kernel));

	if (proc_stat_to_buffer(buffer, sizeof buffer, pid))
		return;

	p = proc_stat_after_cmd (buffer);
	if (!p) return;

	p = skip_multiple_token (p, 6);

	buf->k_flags   = strtoull (p, &p, 0);
	buf->min_flt   = strtoull (p, &p, 0);
	buf->cmin_flt  = strtoull (p, &p, 0);
	buf->maj_flt   = strtoull (p, &p, 0);
	buf->cmaj_flt  = strtoull (p, &p, 0);

	p = skip_multiple_token (p, 15);

	buf->kstk_esp = strtoull (p, &p, 0);
	buf->kstk_eip = strtoull (p, &p, 0);

	p = skip_multiple_token (p, 4);

	buf->nwchan = strtoull (p, &p, 0);

	proc_file_to_buffer(buf->wchan, sizeof buf->wchan, "/proc/%d/wchan", pid),

	buf->flags = _glibtop_sysdeps_proc_kernel;
}
示例#2
0
gboolean
mono_debugger_libgtop_glue_get_memory (int pid, LibGTopGlueMemoryInfo *info)
{
	char buffer [BUFSIZ], *p;

	if (proc_stat_to_buffer (buffer, sizeof buffer, pid))
		return FALSE;

	p = proc_stat_after_cmd (buffer);
	if (!p) return FALSE;

	p = skip_multiple_token (p, 20);

	info->vsize    = strtoull (p, &p, 0);
	info->rss      = strtoull (p, &p, 0);
	info->rss_rlim = strtoull (p, &p, 0);

	if (proc_statm_to_buffer (buffer, sizeof buffer, pid))
		return FALSE;

	info->size     = strtoull (buffer, &p, 0);
	info->resident = strtoull (p, &p, 0);
	info->share    = strtoull (p, &p, 0);

	return TRUE;
}
示例#3
0
void
glibtop_get_proc_segment_s (glibtop *server, glibtop_proc_segment *buf,
			    pid_t pid)
{
	char buffer [BUFSIZ], *p;
	const size_t pagesize = getpagesize();

	memset (buf, 0, sizeof (glibtop_proc_segment));

	if (proc_stat_to_buffer(buffer, sizeof buffer, pid))
		return;

	p = proc_stat_after_cmd (buffer);
	if (!p) return;

	p = skip_multiple_token (p, 23);

	buf->start_code  = strtoull (p, &p, 0);
	buf->end_code    = strtoull (p, &p, 0);
	buf->start_stack = strtoull (p, &p, 0);

	buf->flags = _glibtop_sysdeps_proc_segment;

	if (proc_statm_to_buffer(buffer, sizeof buffer, pid))
		return;

	p = skip_multiple_token (buffer, 3);

	/* This doesn't work very well due to a bug in the Linux kernel.
	 * I'll submit a patch to the kernel mailing list soon. */

	buf->text_rss   = strtoull (p, &p, 0);
	buf->shlib_rss  = strtoull (p, &p, 0);
	buf->data_rss   = strtoull (p, &p, 0);
	buf->dirty_size = strtoull (p, &p, 0);

	buf->text_rss   *= pagesize;
	buf->shlib_rss  *= pagesize;
	buf->data_rss   *= pagesize;
	buf->dirty_size *= pagesize;

	buf->flags |= _glibtop_sysdeps_proc_segment_statm;
}
示例#4
0
文件: procuid.c 项目: GNOME/libgtop
void
glibtop_get_proc_uid_s (glibtop *server, glibtop_proc_uid *buf, pid_t pid)
{
	char buffer [BUFSIZ], *p;

	memset (buf, 0, sizeof (glibtop_proc_uid));

	if (proc_status_to_buffer(buffer, sizeof buffer, pid))
		return;

	/* Search substring 'Pid:' */

	p = strstr (buffer, "\nPid:");
	if (!p) return;

	p = skip_token (p); /* "Pid:" */
	buf->pid = strtol (p, &p, 0);

	p = skip_token (p); /* "PPid:" */
	buf->ppid = strtol (p, &p, 0);

	/* Maybe future Linux versions place something between
	 * "PPid" and "Uid", so we catch this here. */
	p = strstr (p, "\nUid:");
	if (!p) return;

	p = skip_token (p); /* "Uid:" */
	buf->uid  = strtol (p, &p, 0);
	buf->euid = strtol (p, &p, 0);

	/* We don't know how many entries on the "Uid:" line
	 * future Linux version will have, so we catch this here. */
	p = strstr (p, "\nGid:");
	if (!p) return;

	p = skip_token (p); /* "Gid:" */
	buf->gid  = strtol (p, &p, 0);
	buf->egid = strtol (p, &p, 0);

	buf->flags = _glibtop_sysdeps_proc_uid;

	if (proc_stat_to_buffer(buffer, sizeof buffer, pid))
		return;

	p = proc_stat_after_cmd (buffer);
	if (!p) return;

	p = skip_multiple_token (p, 2);

	buf->pgrp    = strtol (p, &p, 0);
	buf->session = strtol (p, &p, 0);
	buf->tty     = strtol (p, &p, 0);
	buf->tpgid   = strtol (p, &p, 0);

	p = skip_multiple_token (p, 9);

	buf->priority = strtol (p, &p, 0);
	buf->nice     = strtol (p, &p, 0);

	if (buf->tty == 0)
		/* the old notty val, update elsewhere bef. moving to 0 */
		buf->tty = -1;

	if (server->os_version_code < LINUX_VERSION_CODE(1,3,39)) {
		/* map old meanings to new */
		buf->priority = 2*15 - buf->priority;
		buf->nice = 15 - buf->nice;
	}
	else if (server->os_version_code < LINUX_VERSION_CODE(1,1,30) && buf->tty != -1)
		/* when tty wasn't full devno */
		buf->tty = 4*0x100 + buf->tty;

	buf->flags |= _glibtop_sysdeps_proc_uid_stat;
}