- Fixed bug in functions.c

- switched from /proc/<pid>/status to /proc/<pid>/stat
- removed the SleepAVG column 



(Old svn revision: 1264)
This commit is contained in:
Johannes Zellner
2006-03-29 17:25:27 +00:00
parent 255757695a
commit c15410224b
4 changed files with 74 additions and 39 deletions

View File

@@ -55,55 +55,100 @@ gboolean refresh_task_list(void)
gchar task_file_name_status[64] = "/proc/";
g_strlcat(task_file_name_status,dir_entry->d_name, sizeof task_file_name_status);
#if defined(__NetBSD__)
g_strlcat(task_file_name_status,"/status", sizeof task_file_name_status);
#else
g_strlcat(task_file_name_status,"/stat", sizeof task_file_name_status);
#endif
gchar buffer_status[256];
struct task task;
struct passwd *passwdp;
struct stat status;
stat(task_file_name_status, &status);
memset(&task, 0, sizeof(task));
if((task_file_status = fopen(task_file_name_status,"r")) != NULL)
{
while(fgets(buffer_status, sizeof buffer_status, task_file_status) != NULL)
{
gchar dummy[255];
#if defined(__NetBSD__)
/*
* NetBSD: /proc/number/status
* init 1 0 1 1 -1,-1 sldr 1131254603,930043 0,74940 0,87430 wait 0 0,0
*/
gchar dummy[255];
sscanf(buffer_status, "%s %i %i %s %s %s %s %s %s %s %s %i %s",
&task.name, &task.pid, &task.ppid, &dummy, &dummy, &dummy,
&dummy, &dummy, &dummy, &dummy, &dummy, &task.uid, &dummy);
#else
sscanf(buffer_status,"Uid: %i",&task.uid);
sscanf(buffer_status,"Pid: %i",&task.pid);
sscanf(buffer_status,"PPid: %i",&task.ppid);
sscanf(buffer_status,"Name: %s",&task.name);
sscanf(buffer_status,"VmSize: %i",&task.size);
sscanf(buffer_status,"VmRSS: %i",&task.rss);
// fix for freebsd with linux emo
sscanf(buffer_status,"VmRss: %i",&task.rss);
sscanf(buffer_status,"State: %c",&task.state);
sscanf(buffer_status,"SleepAVG: %i",&task.sleep);
//sscanf(buffer_status, "%d %s %c %d %d %d %d %d %lu %lu %lu %lu %lu %lu %lu %ld %ld %ld %ld %ld %ld %lu %lu %ld %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %d %d",
sscanf(buffer_status, "%i %s %c %i %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %i %i %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s",
&task.pid, // processid
&task.name, // processname
&task.state, // processstate
&task.ppid, // parentid
&dummy, // processs groupid
&dummy, // session id
&dummy, // tty id
&dummy, // tpgid: The process group ID of the process running on tty of the process
&dummy, // flags
&dummy, // minflt minor faults the process has maid
&dummy, // cminflt
&dummy, // majflt
&dummy, // cmajflt
&dummy, // utime the number of jiffies that this process has scheduled in user mode
&dummy, // stime " kernel mode
&dummy, // cutime " waited for children in user
&dummy, // cstime " kernel mode
&dummy, // priority (nice value + fifteen)
&dummy, // nice range from 19 to -19
&dummy, // hardcoded 0
&dummy, // itrealvalue time in jiffies to next SIGALRM send to this process
&dummy, // starttime jiffies the process startet after system boot
&task.size, // vsize in bytes
&task.rss, // rss
&dummy, // rlim limit in bytes for rss
&dummy, // startcode
&dummy, // endcode
&dummy, // startstack
&dummy, // kstkesp value of esp (stack pointer)
&dummy, // kstkeip value of EIP (instruction pointer)
&dummy, // signal. bitmap of pending signals
&dummy, // blocked: bitmap of blocked signals
&dummy, // sigignore: bitmap of ignored signals
&dummy, // sigcatch: bitmap of catched signals
&dummy, // wchan
&dummy, // nswap
&dummy, // cnswap
&dummy, // exit_signal
&dummy, // CPU number last executed on
&dummy,
&dummy
);
#endif
}
task.uid = status.st_uid;
passwdp = getpwuid(task.uid);
if(passwdp != NULL && passwdp->pw_name != NULL)
g_strlcpy(task.uname, passwdp->pw_name, sizeof task.uname);
}
fclose(task_file_status);
if(task_file_status != NULL)
fclose(task_file_status);
/* check if task is new and marks the task that its checked*/
gboolean new_task = TRUE;
for(i = 0; i < tasks; i++)
{
struct task *data = &g_array_index(task_array, struct task, i);
if((gint)data->pid == task.pid)
{
if((gint)data->ppid != task.ppid || (gchar)data->state != task.state || (unsigned int)data->size != task.size || (unsigned int)data->rss != task.rss)
@@ -120,7 +165,7 @@ gboolean refresh_task_list(void)
break;
}
}
if(new_task)
{
task.checked = TRUE;
@@ -158,20 +203,18 @@ void fill_list_item(gint i, GtkTreeIter *iter)
gchar *pid = g_strdup_printf("%i", task->pid);
gchar *ppid = g_strdup_printf("%i", task->ppid);
gchar *state = g_strdup_printf("%c", task->state);
gchar *size = g_strdup_printf("%i kb", task->size);
gchar *rss = g_strdup_printf("%i kb", task->rss);
gchar *size = g_strdup_printf("%i kB", task->size);
gchar *rss = g_strdup_printf("%i kB", task->rss);
gchar *name = g_strdup_printf("%s", task->name);
gchar *uname = g_strdup_printf("%s", task->uname);
gchar *sleep = g_strdup_printf("%i %%", task->sleep);
gtk_list_store_set(GTK_LIST_STORE(list_store), iter, 0, name, -1);
gtk_list_store_set(GTK_LIST_STORE(list_store), iter, 1, pid, -1);
gtk_list_store_set(GTK_LIST_STORE(list_store), iter, 2, ppid, -1);
gtk_list_store_set(GTK_LIST_STORE(list_store), iter, 3, state, -1);
gtk_list_store_set(GTK_LIST_STORE(list_store), iter, 4, size, -1);
gtk_list_store_set(GTK_LIST_STORE(list_store), iter, 5, sleep, -1);
gtk_list_store_set(GTK_LIST_STORE(list_store), iter, 6, rss, -1);
gtk_list_store_set(GTK_LIST_STORE(list_store), iter, 7, uname, -1);
gtk_list_store_set(GTK_LIST_STORE(list_store), iter, 5, rss, -1);
gtk_list_store_set(GTK_LIST_STORE(list_store), iter, 6, uname, -1);
free(pid);
free(ppid);
@@ -180,7 +223,6 @@ void fill_list_item(gint i, GtkTreeIter *iter)
free(rss);
free(name);
free(uname);
free(sleep);
}
}

View File

@@ -25,6 +25,7 @@
#include <dirent.h>
#include <pwd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <libxfce4util/libxfce4util.h>

View File

@@ -93,7 +93,6 @@ GtkWidget* create_main_window (void)
void change_list_store_view(void)
{
gtk_tree_view_column_set_visible (column4, full_view);
gtk_tree_view_column_set_visible (column_sleep, full_view);
gtk_tree_view_column_set_visible (column5, full_view);
gtk_tree_view_column_set_visible (column6, full_view);
}
@@ -135,23 +134,17 @@ void create_list_store(void)
gtk_tree_view_column_set_sort_column_id(column5, 4);
gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(list_store), 4, compare_list_item, (void *)4, NULL);
gtk_tree_view_append_column(GTK_TREE_VIEW(treeview1), column5);
column_sleep = gtk_tree_view_column_new_with_attributes(_("Sleep"), cell_renderer, "text", 5, NULL);
gtk_tree_view_column_set_resizable(column_sleep, TRUE);
gtk_tree_view_column_set_sort_column_id(column_sleep, 5);
gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(list_store), 5, compare_list_item, (void *)5, NULL);
gtk_tree_view_append_column(GTK_TREE_VIEW(treeview1), column_sleep);
column6 = gtk_tree_view_column_new_with_attributes(_("RSS"), cell_renderer, "text", 6, NULL);
column6 = gtk_tree_view_column_new_with_attributes(_("RSS"), cell_renderer, "text", 5, NULL);
gtk_tree_view_column_set_resizable(column6, TRUE);
gtk_tree_view_column_set_sort_column_id(column6, 6);
gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(list_store), 6, compare_list_item, (void *)6, NULL);
gtk_tree_view_column_set_sort_column_id(column6, 5);
gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(list_store), 5, compare_list_item, (void *)5, NULL);
gtk_tree_view_append_column(GTK_TREE_VIEW(treeview1), column6);
column7 = gtk_tree_view_column_new_with_attributes(_("User"), cell_renderer, "text", 7, NULL);
column7 = gtk_tree_view_column_new_with_attributes(_("User"), cell_renderer, "text", 6, NULL);
gtk_tree_view_column_set_resizable(column7, TRUE);
gtk_tree_view_column_set_sort_column_id(column7, 7);
gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(list_store), 7, compare_list_item, (void *)7, NULL);
gtk_tree_view_column_set_sort_column_id(column7, 6);
gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(list_store), 6, compare_list_item, (void *)6, NULL);
gtk_tree_view_append_column(GTK_TREE_VIEW(treeview1), column7);
change_list_store_view();

View File

@@ -34,7 +34,6 @@ struct task
gint size;
gint rss;
gboolean checked;
gint sleep;
};
GtkWidget *main_window;