ftp.nice.ch/pub/next/unix/admin/tasks.N.bs.tar.gz#/tasks.c

This is tasks.c in view mode; [Download] [Up]

#include <mach.h>
#include <sys/table.h>
#include <pwd.h>
#include <time.h>

void main(int argc, char *argv[])
{
	int				 i,j,cpu,tot_cpu,RAM;
	int    			 u_time, s_time;
	task_array_t    task_list;
	unsigned int    task_count;
	thread_array_t	 thread_list;
	unsigned int	 thread_count;
	char				 ESC = 27;
	time_t			 clock;
	processor_set_t default_set, default_set_priv;
	kern_return_t   error;

	unsigned int				  pid;

	struct host_basic_info	  host_Info;
	unsigned int				  host_info_count=HOST_BASIC_INFO_COUNT;
	struct task_basic_info	  task_Info;
	unsigned	int			     task_info_count=TASK_BASIC_INFO_COUNT;
	struct thread_basic_info  thread_Info;
	unsigned int              thread_info_count=THREAD_BASIC_INFO_COUNT;
	
	struct tbl_procinfo proc_info;
	
	struct pig_struct {
		char	name[20];
		int	pid;
		int	cpu;
		int	mem;
		int	vsize;
		int	rsize;
		char	tty[20];
		char	status[2];
		char	time[7];
		char	command[20];
	};
	
	struct pig_struct	pigs[50];	/* PID,CPU */
	int					pig_count;
	struct passwd		*pw;
	char					host[12];
	
	int	delay = 3;
	
/*================================================================*/
	if(argc==2)
		delay=atoi(argv[1]);
		
	gethostname(host,12);

	error=processor_set_default(host_self(), &default_set);
	if (error!=KERN_SUCCESS) {
		mach_error("Error calling processor_set_default()", error);
    	exit(1);
	}

	error=host_processor_set_priv(host_priv_self(), default_set,
    	&default_set_priv);
	if (error != KERN_SUCCESS) {
    	mach_error("Call to host_processor_set_priv() failed", error);
    	exit(1);
	}
	
	error=host_info(host_self(), HOST_BASIC_INFO, 
    	(host_info_t)&host_Info, &host_info_count);
	if (error != KERN_SUCCESS)
    	mach_error("host_info() call failed", error);
	else  
    	RAM = host_Info.memory_size;

while(1) 
{
	error=processor_set_tasks(default_set_priv, &task_list, &task_count);
	if (error != KERN_SUCCESS) {
    	mach_error("Call to processor_set_tasks() failed", error); 
    	exit(1);
	}
	tot_cpu = 0;
	pig_count = 0;
	for(i=0; i<task_count; i++) {
		error=task_info(task_list[i], TASK_BASIC_INFO,
			(task_info_t)&task_Info,&task_info_count);
		if(error!=KERN_SUCCESS)
			mach_error("Error calling task_info",error);
		error = task_threads(task_list[i], &thread_list, &thread_count);
		if (error != KERN_SUCCESS)
    		mach_error("Error calling task_threads", error);
		else {
			unix_pid(task_list[i],&pid);
			u_time = s_time = 0;
			cpu = 0;
			for(j=0; j<thread_count; j++) {
				error=thread_info(thread_list[j], THREAD_BASIC_INFO, 
    				(thread_info_t)&thread_Info, &thread_info_count);
				if (error!=KERN_SUCCESS)
    				mach_error("Error calling thread_info()", error);
				else {
					u_time += thread_Info.user_time.seconds;
					s_time += thread_Info.system_time.seconds;
					cpu += thread_Info.cpu_usage;
				}	
			}
			error = vm_deallocate(task_self(), (vm_address_t)thread_list, 
        		sizeof(thread_list)*thread_count);
    		if (error != KERN_SUCCESS)
        		mach_error("Trouble freeing thread_list", error);
		
		/* account for terminated threads */
			u_time += task_Info.user_time.seconds;
			s_time += task_Info.system_time.seconds;
					
			tot_cpu += cpu;	
			if(cpu) {
			/* pid */
				pigs[pig_count].pid = pid;
			/* cpu % */
				pigs[pig_count].cpu = cpu;
			/* total time */
				if((u_time + s_time) % 60 > 9)
					sprintf(pigs[pig_count].time,"%u:%2u",(u_time+s_time)/60,
						(u_time+s_time) % 60);
				else
					sprintf(pigs[pig_count].time,"%u:0%1u",(u_time+s_time)/60,
						(u_time+s_time) % 60);				
			/* get process info */
				table(TBL_PROCINFO, pid, (char *)&proc_info, 1,sizeof proc_info);
			/* get user name */
				pw = getpwuid(proc_info.pi_uid);
				strcpy(pigs[pig_count].name,pw->pw_name);
			/* get tty name */
				if(isatty(proc_info.pi_ttyd))
					strcpy(pigs[pig_count].tty,ttyname(proc_info.pi_ttyd)+5);
				else
					strcpy(pigs[pig_count].tty,"");
			/* get command line */
				strcpy(pigs[pig_count].command,proc_info.pi_comm);
			/* memory sizes */
				pigs[pig_count].vsize = task_Info.virtual_size/1024;
				pigs[pig_count].rsize = task_Info.resident_size/1024;
			
				
				pig_count++;
			}
		}
	}
	printf("%c[00;00H",ESC);   /* goto 0,0 */
	printf("%c[2J",ESC);			/* clear the screen */
	clock = time(NULL);
	printf("%-12s  LOAD: %5.1f           %26s",host,tot_cpu*100.0/LOAD_SCALE,
		ctime(&clock));
	printf("%c[7m",ESC);			/* reverse video */
	printf("USER       PID  %%CPU  %%MEM  VSIZE  RSIZE   TTY    TIME COMMAND          \n");
	printf("%c[0m",ESC);			/* normal video */
	for(j=0; j<pig_count; j++)	{
	 	printf("%-8s %5u  %4.1f  %4.1f %6u %6u %-5s %7s %-20s\n",
			pigs[j].name,
	 	 	pigs[j].pid,
			pigs[j].cpu*100.0/LOAD_SCALE,
			pigs[j].rsize*100.0/(RAM/1024),
			pigs[j].vsize,
			pigs[j].rsize,
			pigs[j].tty,
			pigs[j].time,
			pigs[j].command);
	}
		
	error=vm_deallocate(task_self(), (vm_address_t)task_list, 
    	sizeof(task_list)*task_count);
	if (error != KERN_SUCCESS)
    	mach_error("Trouble freeing task_list", error);
	
	sleep(delay);
}
	return;
}

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.