From a1e8eb5a8b210bfc3e20b416a6ea5a6b22941f70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9Cchenyue=E2=80=9D?= <10195501438@stu.ecnu.edu.cn> Date: Sat, 13 Mar 2021 22:58:37 +0800 Subject: [PATCH] 3.13 commit --- fun.h | 9 +- fun_1.c | 17 ++- fun_2.c | 86 ++++++++++++-- main | Bin 23680 -> 24136 bytes main.c | 1 - mytop.c | 407 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 497 insertions(+), 23 deletions(-) create mode 100644 mytop.c diff --git a/fun.h b/fun.h index 967fdf1..0552a93 100644 --- a/fun.h +++ b/fun.h @@ -5,11 +5,10 @@ #include "fun_1.c" #include "fun_2.c" +//void history(char *cmdline); +//void print_his(char *argv); -void history(char *cmdline); -void print_his(char *argv); - -void eval(char *cmdline); -int parseline(const char *cmdline, char **argv); +//void eval(char *cmdline); +//int parseline(const char *cmdline, char **argv); #endif // FUN_H_INCLUDED diff --git a/fun_1.c b/fun_1.c index 02ae6ad..8fe04f9 100644 --- a/fun_1.c +++ b/fun_1.c @@ -1,9 +1,10 @@ #include #include #include -#include #include +#include +#include "mytop.c" //#include "fun.h" @@ -26,6 +27,9 @@ void eval(char *cmdline) { if(isBg) { + int fd = open( "/dev/null", O_RDWR ); + dup2( fd, 0 ); + dup2( fd, 1 ); signal(SIGCHLD, SIG_IGN); } if(execvp(argv[0],argv)<0) @@ -109,7 +113,7 @@ int builtin_cmd(char **argv) { return 1; } - if(Is_open(argv)==1) + if(Is_redirect(argv)==1) { return 1; } @@ -119,7 +123,7 @@ int builtin_cmd(char **argv) } if(!strcmp(argv[0],"history")) { - print_his(argv[1]); + print_history(argv[1]); return 1; } if(!strcmp(argv[0],"cd")) @@ -137,15 +141,10 @@ int builtin_cmd(char **argv) return 1; } } - if(!strcmp(argv[0],"mytop")) { + mytop(); return 1; } - if(!strcmp(argv[0],"bg")||!strcmp(argv[0],"fg")) - { - return 1; - } - return 0; } \ No newline at end of file diff --git a/fun_2.c b/fun_2.c index 52d0b77..2ffb034 100644 --- a/fun_2.c +++ b/fun_2.c @@ -11,7 +11,7 @@ void history(char *cmdline) num++; } -void print_his(char *argv) +void print_history(char *argv) { int i = num - atoi(argv); @@ -96,7 +96,7 @@ void shell_pip(char **prog1, char **prog2) return 0; } -int Is_open(char **argv) +int Is_redirect(char **argv) { int i = 0; int Isopen = 0; @@ -129,15 +129,16 @@ int Is_open(char **argv) i++; j++; } - cmd_1[j] = NULL; - shell_open(cmd_0, cmd_1); + cmd_1[j] = NULL; + + shell_direct(cmd_0, cmd_1); return 1; } -void shell_open(char **prog1, char **prog2) +void shell_direct(char **prog1, char **prog2) { - //根据解析命令参数,创建/打开一文件 int fd; + if(prog1) if(fork() == 0) { if( (fd=open(prog2[0],O_RDWR | O_CREAT | O_NOCTTY | O_NDELAY))<0 ) @@ -149,8 +150,77 @@ void shell_open(char **prog1, char **prog2) dup(fd); close(fd); execvp(prog1[0], prog1); - exit(1); + remove(prog2[0]); + exit(0); + } + wait(0); + if(fork() == 0) + { + if( (fd=open(prog1[0],O_RDWR | O_NOCTTY | O_NDELAY))<0 ) + { + exit(0); + } + close(0); + dup(fd); + close(fd); + execvp(prog2[0], prog2); + exit(0); } wait(0); -} +} + +/* +void mytop() +{ + FILE *fp; + unsigned int pagesize; + unsigned long total, free, largest, cached; + if ((fp = fopen("/proc/meminfo", "r")) == NULL) + return 0; + if (fscanf(fp, "%u %lu %lu %lu %lu", &pagesize, &total, &free, &largest, &cached) != 5) + { + fclose(fp); + return 0; + } + fclose(fp); + printf("main memory: %ldK total, %ldK free, %ldK contig free, %ldK cached\n", + (pagesize * total)/1024, (pagesize * free)/1024, + (pagesize * largest)/1024, (pagesize * cached)/1024); + + return 1; +} + +//tp 结构体 +//包含了进程指针p和ticks,对应某个进程和滴答 +struct tp { + struct proc *p; + u64_t ticks; +}; +//计算cputicks 用到当前进程和其他进程的,还涉及CPUTIME +u64_t cputicks(struct proc *p1, struct proc *p2, int timemode) +{ + int i; + u64_t t = 0; + //计算每个进程proc的滴答,通过proc和当前进程prev_proc做比较,如果endpoint相等,则在循环中分别计算 + for(i = 0; i < CPUTIMENAMES; i++) { + if(!CPUTIME(timemode, i)) + continue; + if(p1->p_endpoint == p2->p_endpoint) { + t = t + p2->p_cpucycles[i] - p1->p_cpucycles[i]; + } else { + t = t + p2->p_cpucycles[i]; + } + } +// for(i = 0; i < CPUTIMENAMES; i++) { +// if(!CPUTIME(timemode, i)) +// continue; +// if(proc->p_endpoint == prev_proc->p_endpoint) { +// t = t + prev_proc->p_cpucycles[i] - proc->p_cpucycles[i]; +// } else { +// t = t + prev_proc->p_cpucycles[i]; +// } +// } + return t; +} +*/ \ No newline at end of file diff --git a/main b/main index e9cf204111f89d8372e26b0a2354076c66ddeb6c..267af9516d65d899a6291eff88d936d11c57f771 100755 GIT binary patch literal 24136 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 +#include +#include +#include +//#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +typedef int endpoint_t; +typedef uint64_t u64_t; +typedef long unsigned int vir_bytes; + +#define USED 0x1 +#define IS_TASK 0x2 +#define IS_SYSTEM 0x4 +#define BLOCKED 0x8 +#define TYPE_TASK 'T' +#define TYPE_SYSTEM 'S' +#define STATE_RUN 'R' + +#define MAX_NR_TASKS 1023 +#define SELF ((endpoint_t) 0x8ace) +#define _MAX_MAGIC_PROC (SELF) +#define _ENDPOINT_GENERATION_SIZE (MAX_NR_TASKS+_MAX_MAGIC_PROC+1) +#define _ENDPOINT_P(e) \ +((((e)+MAX_NR_TASKS) % _ENDPOINT_GENERATION_SIZE) - MAX_NR_TASKS) +#define SLOT_NR(e) (_ENDPOINT_P(e) + 5) +#define _PATH_PROC "/proc" +#define CPUTIME(m, i) (m & (1L << (i))) +const char *cputimenames[] = { "user", "ipc", "kernelcall" }; + +#define CPUTIMENAMES (sizeof(cputimenames)/sizeof(cputimenames[0])) +unsigned int nr_procs, nr_tasks; + +int nr_total=0; +//int slot_a=0; +//int pronum=0; +//int filenum=0; +//proc 结构体 +struct proc { + int p_flags; + endpoint_t p_endpoint; + pid_t p_pid; + u64_t p_cpucycles[CPUTIMENAMES]; + int p_priority; + endpoint_t p_blocked; + time_t p_user_time; + vir_bytes p_memory; + uid_t p_effuid; + int p_nice; + char p_name[16+1]; +}; + +struct proc *proc = NULL, *prev_proc = NULL; +//u64_t 64位 high和low32位 拼接成64位 high+low +static inline u64_t make64(unsigned long lo, unsigned long hi) +{ + return ((u64_t)hi << 32) | (u64_t)lo; +} +//把每个pid/psinfo的信息读出来 +//判断读取信息是否可用 +void parse_file(pid_t pid) +{ + char path[PATH_MAX], name[256], type, state; + int version, endpt, effuid; + unsigned long cycles_hi, cycles_lo; + FILE *fp; + struct proc *p; + int slot; + int i; + + sprintf(path, "/proc/%d/psinfo", pid); + //按照/proc/%d/psinfo打开path中的文件 + if ((fp = fopen(path, "r")) == NULL) + return; + //version是否为1,如果不是该进程不需要记录 + if (fscanf(fp, "%d", &version) != 1) { + fclose(fp); + return; + } + //versions错误处理 + if (version != 0) { + fputs("procfs version mismatch!\n", stderr); + exit(1); + } + //读入类型和端点 判断是否读入的是两个 + if (fscanf(fp, " %c %d", &type, &endpt) != 2) { + fclose(fp); + return; + } + //统计总file数 + //filenum+=1; + //原来的slot超出了nr_total + slot = SLOT_NR(endpt); + slot++; + //slot=slot_a; + //slot_a+=1;//赋值需保证在数组中不会重复 + + //判断endpoint的值是否合理 在0到nr_total的范围内 + if(slot < 0 || slot >= nr_total) { + fprintf(stderr, "top: unreasonable endpoint number %d\n", endpt); + fclose(fp); + return; + } + //slot为该进程结构体在数组中的位置 + p = &proc[slot];//把slot地址赋值给p + + if (type == TYPE_TASK) + //标示task进程 + p->p_flags |= IS_TASK; + else if (type == TYPE_SYSTEM) + //标示system进程 + p->p_flags |= IS_SYSTEM; + //将endpt和pid存入对应进程结构体 + p->p_endpoint = endpt; + p->p_pid = pid; + //读入名字 状态 阻塞状态 动态优先级 进程时间 高周期 低周期 + if (fscanf(fp, " %255s %c %d %d %lu %*u %lu %lu", + name, &state, &p->p_blocked, &p->p_priority, + &p->p_user_time, &cycles_hi, &cycles_lo) != 7) { + + fclose(fp); + return; + } + //将指定长度的字符串复制到字符数组中 + strncpy(p->p_name, name, sizeof(p->p_name)-1); + //数组置0 + p->p_name[sizeof(p->p_name)-1] = 0; + + if (state != STATE_RUN)//如果不是run的进程 + p->p_flags |= BLOCKED;//标志阻塞 + //拼接成64位,放在p_cpucycles[]数组中 + p->p_cpucycles[0] = make64(cycles_lo, cycles_hi); + p->p_memory = 0L; + //判断是否为有效用户ID + if (!(p->p_flags & IS_TASK)) { + int j; + //读如内存 有效用户ID 和静态优先级 + if ((j=fscanf(fp, " %lu %*u %*u %*c %*d %*u %u %*u %d %*c %*d %*u", + &p->p_memory, &effuid, &p->p_nice)) != 3) { + + fclose(fp); + return; + } + + p->p_effuid = effuid; + } else p->p_effuid = 0; +//连续读CPUTIMENAMES次cycles_hi,cycle_lo + for(i = 1; i < CPUTIMENAMES; i++) { + if(fscanf(fp, " %lu %lu", + &cycles_hi, &cycles_lo) == 2) { + //拼接成64位,放在p_cpucycles[]数组中 + p->p_cpucycles[i] = make64(cycles_lo, cycles_hi); + } else { + p->p_cpucycles[i] = 0; + } + } + //读如内存 存入进程结构体 + if ((p->p_flags & IS_TASK)) { + if(fscanf(fp, " %lu", &p->p_memory) != 1) { + p->p_memory = 0; + } + } + //按位或 + p->p_flags |= USED; + + + fclose(fp); +} +void parse_dir(void) +{ + DIR *p_dir; + struct dirent *p_ent; + pid_t pid; + char *end; + //打开/proc + if ((p_dir = opendir("/proc/")) == NULL) { + perror("opendir on /proc"); + exit(1); + } + //readdir()返回参数p_dir 目录流的下个目录进入点。 + p_ent=readdir(p_dir); + while(p_ent != NULL){ +// if(strncpy(p_ent->d_name,"/proc",1)==0) +// continue; + //分析出里面所有pid + pid=strtol(p_ent->d_name,&end,10); + if(pid!=0 && !end[0]){ + //printf("%l\n",pid); + //一个pid调用一次parse_file + parse_file(pid); + } + + p_ent=readdir(p_dir); + } + + closedir(p_dir); +} +int print_memory(void) +{ + FILE *fp; + unsigned int pagesize; + unsigned long total, free, largest, cached; + //打开meminfo + if ((fp = fopen("/proc/meminfo", "r")) == NULL) + return 0; + //读输入 + if (fscanf(fp, "%u %lu %lu %lu %lu", &pagesize, &total, &free, + &largest, &cached) != 5) { + fclose(fp); + return 0; + } + + fclose(fp); + //打印memory信息 + printf("main memory: %ldK total, %ldK free, %ldK contig free, " + "%ldK cached\n", + (pagesize * total)/1024, (pagesize * free)/1024, + (pagesize * largest)/1024, (pagesize * cached)/1024); + + return 1; +} +//tp 结构体 +//包含了进程指针p和ticks,对应某个进程和滴答 +struct tp { + struct proc *p; + u64_t ticks; +}; +//计算cputicks 用到当前进程和其他进程的,还涉及CPUTIME + +//滴答并不是简单的结构体中的滴答,因为在写文件的时候需要更新。需要通过当前进程来和该进程一起计算 +u64_t cputicks(struct proc *p1, struct proc *p2, int timemode) +{ + int i; + u64_t t = 0; + //计算每个进程proc的滴答,通过proc和当前进程prev_proc做比较,如果endpoint相等,则在循环中分别计算 + for(i = 0; i < CPUTIMENAMES; i++) { + if(!CPUTIME(timemode, i)) + continue; + if(p1->p_endpoint == p2->p_endpoint) { + t = t + p2->p_cpucycles[i] - p1->p_cpucycles[i]; + } else { + t = t + p2->p_cpucycles[i]; + } + } +// for(i = 0; i < CPUTIMENAMES; i++) { +// if(!CPUTIME(timemode, i)) +// continue; +// if(proc->p_endpoint == prev_proc->p_endpoint) { +// t = t + prev_proc->p_cpucycles[i] - proc->p_cpucycles[i]; +// } else { +// t = t + prev_proc->p_cpucycles[i]; +// } +// } + return t; +} +void print_procs( + struct proc *proc1, struct proc *proc2, int cputimemode) +{ + int p, nprocs; + u64_t idleticks = 0; + u64_t kernelticks = 0; + u64_t systemticks = 0; + u64_t userticks = 0; + u64_t total_ticks = 0; + int blockedseen = 0; + static struct tp *tick_procs = NULL; + if (tick_procs == NULL) { + //给tick_procs分配内存 + //创建tp结构体tick_procs + tick_procs = malloc(nr_total * sizeof(tick_procs[0])); + //tick procs错误处理 + if (tick_procs == NULL) { + fprintf(stderr, "Out of memory!\n"); + exit(1); + } + } + + for(p = nprocs = 0; p < nr_total; p++) { + u64_t uticks; + //如果当前进程标志不是used就continue 看下一个进程。 + if(!(proc2[p].p_flags & USED)) + continue; + tick_procs[nprocs].p = proc2 + p; + tick_procs[nprocs].ticks = cputicks(&proc1[p], &proc2[p], cputimemode); + //更新实时uticks + uticks = cputicks(&proc1[p], &proc2[p], 1); + //算出总的ticks + total_ticks = total_ticks + uticks; + //判断是否为idletick + //为0一直continue 不用计算 + if(p-5 == 317) { + idleticks = uticks; + continue; + } + //判断是否为kerneltick + if(p-5 == ((endpoint_t) -1)) { + kernelticks = uticks; + } +// if(!(proc2[p].p_flags & IS_TASK)) { +// if(proc2[p].p_flags & IS_SYSTEM) +// systemticks = systemticks + tick_procs[nprocs].ticks; +// else +// userticks = userticks + tick_procs[nprocs].ticks; +// } + //判断是否为systemtick和usertick + if(!(proc2[p].p_flags & IS_TASK)) { + if(proc2[p].p_flags & IS_SYSTEM) + systemticks = systemticks + tick_procs[nprocs].ticks; + else + userticks = userticks + tick_procs[nprocs].ticks; + } + + nprocs++; + } + + if (total_ticks == 0) + return; + //打印user system kernel idle的情况 + printf("CPU states: %6.2f%% user, ", 100.0 * userticks / total_ticks); + printf("%6.2f%% system, ", 100.0 * systemticks / total_ticks); + printf("%6.2f%% kernel, ", 100.0 * kernelticks/ total_ticks); + printf("%6.2f%% idle",100.00-(100.0 * (kernelticks+userticks+systemticks)/ total_ticks)); + printf("\n"); +} + //get_procs将所有需要的信息放在结构体数组proc[]中,每个元素都是一个进程结构体。 +void get_procs(void) +{ + + struct proc *p; + int i; + + p = prev_proc; + //记录当前进程,赋值给prev_proc + prev_proc = proc; + proc = p; + + if (proc == NULL) { + //分配内存 + //每个进程分配一个结构体 + //分配nr_total个单位proc结构体内存空间,并把指针赋予proc + proc = malloc(nr_total * sizeof(proc[0])); + //错误处理 + if (proc == NULL) { + fprintf(stderr, "Out of memory!\n"); + exit(1); + } + } + //先将所有flag置0 + for (i = 0; i < nr_total; i++) + proc[i].p_flags = 0; + //调用parse_dir分析pid + parse_dir(); + +} +void getkinfo(void) +{ + FILE *fp; + + if ((fp = fopen("/proc/kinfo", "r")) == NULL) { + + exit(1); + } + //读如nr_procs,nr_tasks + if (fscanf(fp, "%u %u", &nr_procs, &nr_tasks) != 2) { + + exit(1); + } + + fclose(fp); + //算出总的nr_total + nr_total = (int) (nr_procs + nr_tasks); +} +int mytop(){ + //跳转到/proc + if (chdir("/proc") != 0) { + perror("chdir to /proc" ); + return 1; + } + print_memory(); + getkinfo(); + get_procs(); + //当前进程为空的话 就要再调用get_procs + if(prev_proc==NULL) + get_procs(); + + print_procs(prev_proc,proc,1); + //fflush(NULL); + + return 0; +} +*/ +int mytop() +{ + +} \ No newline at end of file