diff --git a/user/procstat.c b/user/procstat.c new file mode 100644 index 0000000..b12a819 --- /dev/null +++ b/user/procstat.c @@ -0,0 +1,62 @@ +/* +Copyright (C) 2016-2019 The University of Notre Dame +This software is distributed under the GNU General Public License. +See the file LICENSE for details. +*/ + +#include "library/syscalls.h" +#include "kernel/syscall.h" +#include "kernel/stats.h" +#include "library/string.h" +#include "library/errno.h" + +int main(int argc, const char *argv[]) +{ + if (argc <= 1) { + printf("No program to run\n"); + return 1; + } + unsigned int startTime; + syscall_system_time(&startTime); + + int pid; + int fd = syscall_open_file(KNO_STDDIR,argv[1],0,0); + if(fd>=0) { + pid = syscall_process_fork(); + if (pid == 0) { // child + syscall_process_exec(fd, argc-1, &argv[1]); + printf("exec failed\n"); + return 1; + } else if (pid < 0) { + printf("fork failed\n"); + return -1; + } + } else { + printf("couldn't find %s: %s\n",argv[1],strerror(fd)); + return 1; + } + + /* parent */ + struct process_info info; + syscall_process_wait(&info, -1); + unsigned int timeElapsed; + syscall_system_time(&timeElapsed); + timeElapsed -= startTime; + struct process_stats stat; + syscall_process_stats(&stat, pid); + printf("Process %u exited with status %d\n", info.pid, info.exitcode); + printf("Time elapsed: %d:%d:%d\n", timeElapsed/3600, (timeElapsed%3600)/60, timeElapsed % 60); + printf("%d blocks read, %d blocks written\n", stat.blocks_read, stat.blocks_written); + printf("%d bytes read, %d bytes written\n", stat.bytes_read, stat.bytes_written); + + printf("System calls used:\n"); + for (int i = 0; i < MAX_SYSCALL; i++) { + if (stat.syscall_count[i]) { + printf("Syscall %d: %u\n", i, stat.syscall_count[i]); + } + } + + + + return 0; +}