diff -up procps-3.2.7/slabtop.c.once procps-3.2.7/slabtop.c
--- procps-3.2.7/slabtop.c.once	2008-12-11 13:24:52.000000000 +0100
+++ procps-3.2.7/slabtop.c	2008-12-11 13:33:12.000000000 +0100
@@ -268,9 +268,24 @@ static void parse_input(char c)
 	}
 }
 
+/*printw or printf depending on the context*/
+static void printwf(int once, const char *s,...)
+{
+va_list va;
+
+va_start(va,s);
+if(once) 
+    vprintf(s,va);
+else     
+    vwprintw(stdscr, s, va);
+va_end(va);
+}
+
+
 int main(int argc, char *argv[])
 {
 	int o;
+        int once = 0;
 	unsigned short old_rows;
 	struct slab_info *slab_list = NULL;
 
@@ -307,6 +322,7 @@ int main(int argc, char *argv[])
 			break;
 		case 'o':
 			delay = 0;
+                        once = 1;
 			break;
 		case 'V':
 			display_version();
@@ -322,12 +338,18 @@ int main(int argc, char *argv[])
 	if (tcgetattr(0, &saved_tty) == -1)
 		perror("tcgetattr");
 
-	initscr();
-	term_size(0);
-	old_rows = rows;
-	resizeterm(rows, cols);
-	signal(SIGWINCH, term_size);
-	signal(SIGINT, sigint_handler);
+        if(!once) {
+            initscr();
+	    term_size(0);
+	    old_rows = rows;
+	    resizeterm(rows, cols);
+	    signal(SIGWINCH, term_size);
+	    signal(SIGINT, sigint_handler); 
+        } else {
+            old_rows = rows;
+            rows = 80;
+            cols = 24;
+        }
 
 	do {
 		struct slab_info *curr;
@@ -341,12 +363,12 @@ int main(int argc, char *argv[])
 			break;
 
 		if (old_rows != rows) {
-			resizeterm(rows, cols);
+			if(!once) resizeterm(rows, cols);
 			old_rows = rows;
 		}
 
 		move(0,0);
-		printw(	" Active / Total Objects (%% used)    : %d / %d (%.1f%%)\n"
+		printwf(once,	" Active / Total Objects (%% used)    : %d / %d (%.1f%%)\n"
 			" Active / Total Slabs (%% used)      : %d / %d (%.1f%%)\n"
 			" Active / Total Caches (%% used)     : %d / %d (%.1f%%)\n"
 			" Active / Total Size (%% used)       : %.2fK / %.2fK (%.1f%%)\n"
@@ -360,15 +382,15 @@ int main(int argc, char *argv[])
 
 		slab_list = slabsort(slab_list);
 
-		attron(A_REVERSE);
-		printw(	"%6s %6s %4s %8s %6s %8s %10s %-23s\n",
+		if(!once) attron(A_REVERSE);
+		printwf(once,	"%6s %6s %4s %8s %6s %8s %10s %-23s\n",
 			"OBJS", "ACTIVE", "USE", "OBJ SIZE", "SLABS",
 			"OBJ/SLAB", "CACHE SIZE", "NAME");
-		attroff(A_REVERSE);
+		if(!once) attroff(A_REVERSE);
 
 		curr = slab_list;
 		for (i = 0; i < rows - 8 && curr->next; i++) {
-			printw("%6u %6u %3u%% %7.2fK %6u %8u %9uK %-23s\n",
+			printwf(once, "%6u %6u %3u%% %7.2fK %6u %8u %9uK %-23s\n",
 				curr->nr_objs, curr->nr_active_objs, curr->use,
 				curr->obj_size / 1024.0, curr->nr_slabs,
 				curr->objs_per_slab, (unsigned)(curr->cache_size / 1024),
@@ -376,7 +398,7 @@ int main(int argc, char *argv[])
 			curr = curr->next;
 		}
 
-		refresh();
+		if(!once) refresh();
 		put_slabinfo(slab_list);
 
 		FD_ZERO(&readfds);
@@ -392,6 +414,6 @@ int main(int argc, char *argv[])
 
 	tcsetattr(0, TCSAFLUSH, &saved_tty);
 	free_slabinfo(slab_list);
-	endwin();
+	if(!once) endwin();
 	return 0;
 }
