| // SPDX-License-Identifier: GPL-2.0 | 
 | /* | 
 |  * Copyright (c) 2005 Silicon Graphics, Inc. | 
 |  * All Rights Reserved. | 
 |  */ | 
 |  | 
 | #include "command.h" | 
 | #include "input.h" | 
 | #include <sys/time.h> | 
 | #include <sys/resource.h> | 
 | #include "init.h" | 
 | #include "io.h" | 
 |  | 
 | static cmdinfo_t getrusage_cmd; | 
 |  | 
 | /* | 
 |  * Report process resource utilisation.  Formatting options: | 
 |  * "Shell" format: 0.000u 0.000s 0:00.00 0.0%      0+0k 0+0io 0pf+0w | 
 |  * Verbose format: | 
 |  * 0.00user 0.00system 0:00.00elapsed 0%CPU (0avgtext+0avgdata 0maxresident)k | 
 |  * 0inputs+0outputs (0major+0minor)pagefaults 0swaps | 
 |  * Comma Separated Value format: 0.000,0.000,00:00:00.00,0.0,0,0,0,0,0,0 | 
 |  */ | 
 | static int | 
 | getrusage_f( | 
 | 	int		argc, | 
 | 	char		**argv) | 
 | { | 
 | 	struct timeval	wallclk, timenow; | 
 | 	struct rusage	rusage; | 
 | 	double		usrtime, systime, elapsed, pct_cpu; | 
 | 	char		ts[64]; | 
 | 	int		Cflag, vflag; | 
 | 	int		c; | 
 |  | 
 | 	Cflag = vflag = 0; | 
 | 	while ((c = getopt(argc, argv, "Cv")) != EOF) { | 
 | 		switch (c) { | 
 | 		case 'C': | 
 | 			Cflag = 1; | 
 | 			break; | 
 | 		case 'v': | 
 | 			vflag = 1; | 
 | 			break; | 
 | 		default: | 
 | 			return command_usage(&getrusage_cmd); | 
 | 		} | 
 | 	} | 
 | 	if (optind != argc) | 
 | 		return command_usage(&getrusage_cmd); | 
 |  | 
 | 	if (getrusage(RUSAGE_SELF, &rusage) < 0) { | 
 | 		perror("getrusage"); | 
 | 		exitcode = 1; | 
 | 		return 0; | 
 | 	} | 
 |  | 
 | 	gettimeofday(&timenow, NULL); | 
 | 	wallclk = tsub(timenow, stopwatch); | 
 | 	elapsed = (double)wallclk.tv_sec + | 
 | 		  ((double)wallclk.tv_usec / 1000000.0); | 
 | 	usrtime = (double)rusage.ru_utime.tv_sec + | 
 | 		  ((double)rusage.ru_utime.tv_usec / 1000000.0); | 
 | 	systime = (double)rusage.ru_stime.tv_sec + | 
 | 		  ((double)rusage.ru_stime.tv_usec / 1000000.0); | 
 | 	if (elapsed < usrtime + systime) | 
 | 		pct_cpu = 100.0; | 
 | 	else | 
 | 		pct_cpu = ((usrtime + systime) / elapsed) * 100; | 
 | 	c = Cflag ? VERBOSE_FIXED_TIME : TERSE_FIXED_TIME; | 
 | 	timestr(&wallclk, ts, sizeof(ts), c); | 
 |  | 
 | 	if (Cflag) | 
 | 		printf("%.3f,%.3f,%s,%.1f,%ld,%ld,%ld,%ld,%ld,%ld,%ld\n", | 
 | 			usrtime, systime, ts, pct_cpu, | 
 | 			rusage.ru_majflt, rusage.ru_minflt, rusage.ru_nswap, | 
 | 			rusage.ru_inblock, rusage.ru_oublock, | 
 | 			rusage.ru_nvcsw, rusage.ru_nivcsw); | 
 | 	else if (vflag) | 
 | 		printf("%.2fuser %.2fsystem %selapsed %.0f%%CPU " | 
 | 		       "(%ldavgtext+%ldavgdata %ldmaxresident)k\n" | 
 | 		       "%ldinputs+%ldoutputs " | 
 | 			"(%ldmajor+%ldminor)pagefaults %ldswaps\n", | 
 | 			usrtime, systime, ts, pct_cpu, | 
 | 			rusage.ru_ixrss, rusage.ru_idrss, rusage.ru_maxrss, | 
 | 			rusage.ru_inblock, rusage.ru_oublock, | 
 | 			rusage.ru_majflt, rusage.ru_minflt, rusage.ru_nswap); | 
 | 	else | 
 | 		printf("%.3fu %.3fs %s %.1f%%\t" | 
 | 		       "%ld+%ldk %ld+%ldio %ldpf+%ldw\n", | 
 | 			usrtime, systime, ts, pct_cpu, | 
 | 			rusage.ru_maxrss, rusage.ru_ixrss, | 
 | 			rusage.ru_inblock, rusage.ru_oublock, | 
 | 			rusage.ru_majflt, rusage.ru_nswap); | 
 | 	return 0; | 
 | } | 
 |  | 
 | void | 
 | getrusage_init(void) | 
 | { | 
 | 	getrusage_cmd.name = "getrusage"; | 
 | 	getrusage_cmd.altname = "g"; | 
 | 	getrusage_cmd.argmin = 0; | 
 | 	getrusage_cmd.argmax = -1; | 
 | 	getrusage_cmd.cfunc = getrusage_f; | 
 | 	getrusage_cmd.flags = CMD_NOFILE_OK | CMD_NOMAP_OK | | 
 | 			      CMD_FOREIGN_OK | CMD_FLAG_ONESHOT; | 
 | 	getrusage_cmd.oneline = _("report process resource usage"); | 
 |  | 
 | 	if (expert) | 
 | 		add_command(&getrusage_cmd); | 
 | } |