郎平 180kg:lab4
来源:百度文库 编辑:九乡新闻网 时间:2024/05/01 06:42:33
test12## trace12.txt - Forward SIGTSTP to every process in foreground process group#/bin/echo -e tsh> ./mysplit 4./mysplit 4
SLEEP 2TSTP
/bin/echo tsh> jobsjobs
/bin/echo tsh> /bin/ps a/bin/ps a
## trace12.txt - Forward SIGTSTP to every process in foreground process group#tsh> ./mysplit 4Job [1] (26305) stopped by signal 20tsh> jobs[1] (26305) Stopped ./mysplit 4 tsh> /bin/ps a PID TTY STAT TIME COMMAND25181 pts/3 S 0:00 -usr/local/bin/tcsh -i26239 pts/3 S 0:00 make tshrefout26240 pts/3 S 0:00 /bin/sh -c make tests > tshref.out 2>&126241 pts/3 S 0:00 make tests26302 pts/3 S 0:00 perl ./sdriver.pl -t trace12.txt -s ./tsh -a -p26303 pts/3 S 0:00 ./tsh -p26305 pts/3 T 0:00 ./mysplit 4 //怎么会有两个?26306 pts/3 T 0:00 ./mysplit 4 //怎么会有两个?26309 pts/3 R 0:00 /bin/ps as
一个会话可以理解为一次登录,一次登录可以有多个foreground jobs 运行。还是很好理解的。 重点在forwardforward 是forward到所有的 shell中运行的 而不是使自己stop...要记住,你自己是一个shell...
还是忘了有关子进程的一句话,当exec之后,父进程定义的信号处理函数已经没有用了,但是mask是还有用的??不记得是在哪里看到这句话了。先返回去看看CS61的ppt吧。
test11这里肯定有一些我没有理解的地方这里到底是个么意思? 我什么都没有做结果就是对的哈。
test10记住,jobs是列出所有后台的进程 而不包括前台的进程。重写了listbackgroudjobs。它这里的background jobs 还不单单指BG,还包括ST。是否所有不是FG的全部都为background jobs,暂时这么理解吧!~
test09
竟然是getjobpid(jobs,pid)->state = BG;这句话出了问题 兄弟,你传入的pid是2~ 这个是jid 细心!~细心!~ 细心代表节省时间,兄弟!~
应该用getjobjid这样就对了,不停的跟跟自己说,细心,细心。这样你才能越来越快哈!~
我想把 char *buf= "%234" 这个后面的数字给弄出来,是不是就 atoi(buf+1)即可? 确实是可以的。
是在哪里执行的前台命令? 在builtin_cmd中一边判断的时候就一边做了哈~
为什么tsh> bg %2 的argv[1]是个空的?? 那是因为你单独运行bg的时候木有加参数!
test08收到SIGTSTP之后应该就变成后台程序了吧? 如果完成这一转换? 仅仅操作job list吧 在deletejob前面加了一个判断,这样过了test08
waitpid 被信号SIGTSTP中断之后,返回的时候应该继续waitpid吧
void do_bgfg(char **argv) { return;}这个函数怎么去填咧?在eval里面不是已经进行fork了。先不管嘞。
extern char **environ; /* defined in libc */然后就直接可以用?? environ[0]竟然是GDM_KEYBOARD_LAYOUT=us??完全糊涂了
if (execve(argv[0], argv, environ) < 0) 不用赋个值什么的??
/bin/echo tsh> quit 这个是个什么执行过程??为什么什么输出都没得??
if ((pid = Fork()) == 0) { printf("exec %s\n",argv[0]); if (execve(argv[0], argv, environ) < 0) { printf("%s:Command not found.\n",argv[0]); exit(0); }}为什么就没有输出到终端上面去??
/bin/echo -e tsh> ./myspin 2 \046./myspin 2 &
第一行是个什么东西?为什么第二行它程序一开始就输出真正的命令就是第二行的??第一行是胡扯的??
我暂时仅仅将background job加入了job列表哈~
它的echo也算前台程序哈,这样加的话,jobs会变的很多哈。怎么解决这一个问题呢?
前台程序执行完了之后,自己要马上要deletejob才能完成监控撒
./myspin 4 为什么会出现这个错误./myspin: line 1: tsh:找不到命令myspin.c 里面根本没有涉及tsh的东西哈 myspin当成一个脚本了???确实没有编译成可执行文件,make clean 之后再 make 就OK了
在函数void sigint_handler(int sig)里面不加exit(0) 就仅仅将SIGINT only to foreground job在test07中,截获了SIGINT,我完全什么时候都没有,但是它前端的job还是被clean了,不知道是什么回事情,是否是它休眠的时间到了,然后被deletejob了??pause 和 wait 都可以等待信号?是不是wait的时候接到了SIGINT,它就跳到信号处理的程序,然后就直接运行下一条程序而不是继续回到wait状态??这个是时间到了自己退出的
确实不要exit0的话就仅仅把前端运行的程序搞死了,但是shell的过程建在。
/* clearjob - Clear the entries in a job struct */void clearjob(struct job_t *job) { job->pid = 0; job->jid = 0; job->state = UNDEF; job->cmdline[0] = '\0';}
/* initjobs - Initialize the job list */void initjobs(struct job_t *jobs) { int i;
for (i = 0; i < MAXJOBS; i++) clearjob(&jobs[i]);}
/* maxjid - Returns largest allocated job ID */int maxjid(struct job_t *jobs) { int i, max=0;
for (i = 0; i < MAXJOBS; i++) if (jobs[i].jid > max) max = jobs[i].jid; return max;}
/* addjob - Add a job to the job list */int addjob(struct job_t *jobs, pid_t pid, int state, char *cmdline) { int i; if (pid < 1) return 0;
for (i = 0; i < MAXJOBS; i++) { if (jobs[i].pid == 0) { jobs[i].pid = pid; jobs[i].state = state; jobs[i].jid = nextjid++; if (nextjid > MAXJOBS) nextjid = 1; strcpy(jobs[i].cmdline, cmdline); if(verbose){ printf("Added job [%d] %d %s\n", jobs[i].jid, jobs[i].pid, jobs[i].cmdline); } return 1; } } printf("Tried to create too many jobs\n"); return 0;}
/* deletejob - Delete a job whose PID=pid from the job list */int deletejob(struct job_t *jobs, pid_t pid) { int i;
if (pid < 1) return 0;
for (i = 0; i < MAXJOBS; i++) { if (jobs[i].pid == pid) { clearjob(&jobs[i]); nextjid = maxjid(jobs)+1; return 1; } } return 0;}
/* fgpid - Return PID of current foreground job, 0 if no such job */pid_t fgpid(struct job_t *jobs) { int i;
for (i = 0; i < MAXJOBS; i++) if (jobs[i].state == FG) return jobs[i].pid; return 0;}
/* getjobpid - Find a job (by PID) on the job list */struct job_t *getjobpid(struct job_t *jobs, pid_t pid) { int i;
if (pid < 1) return NULL; for (i = 0; i < MAXJOBS; i++) if (jobs[i].pid == pid) return &jobs[i]; return NULL;}
/* getjobjid - Find a job (by JID) on the job list */struct job_t *getjobjid(struct job_t *jobs, int jid) { int i;
if (jid < 1) return NULL; for (i = 0; i < MAXJOBS; i++) if (jobs[i].jid == jid) return &jobs[i]; return NULL;}
/* pid2jid - Map process ID to job ID */int pid2jid(pid_t pid) { int i;
if (pid < 1) return 0; for (i = 0; i < MAXJOBS; i++) if (jobs[i].pid == pid) { return jobs[i].jid; } return 0;}
/* listjobs - Print the job list */void listjobs(struct job_t *jobs) { int i; for (i = 0; i < MAXJOBS; i++) { if (jobs[i].pid != 0) { printf("[%d] (%d) ", jobs[i].jid, jobs[i].pid); switch (jobs[i].state) { case BG: printf("Running "); break; case FG: printf("Foreground "); break; case ST: printf("Stopped "); break; default: printf("listjobs: Internal error: job[%d].state=%d ", i, jobs[i].state); } printf("%s", jobs[i].cmdline); } }}
SLEEP 2TSTP
/bin/echo tsh> jobsjobs
/bin/echo tsh> /bin/ps a/bin/ps a
## trace12.txt - Forward SIGTSTP to every process in foreground process group#tsh> ./mysplit 4Job [1] (26305) stopped by signal 20tsh> jobs[1] (26305) Stopped ./mysplit 4 tsh> /bin/ps a PID TTY STAT TIME COMMAND25181 pts/3 S 0:00 -usr/local/bin/tcsh -i26239 pts/3 S 0:00 make tshrefout26240 pts/3 S 0:00 /bin/sh -c make tests > tshref.out 2>&126241 pts/3 S 0:00 make tests26302 pts/3 S 0:00 perl ./sdriver.pl -t trace12.txt -s ./tsh -a -p26303 pts/3 S 0:00 ./tsh -p26305 pts/3 T 0:00 ./mysplit 4 //怎么会有两个?26306 pts/3 T 0:00 ./mysplit 4 //怎么会有两个?26309 pts/3 R 0:00 /bin/ps as
一个会话可以理解为一次登录,一次登录可以有多个foreground jobs 运行。还是很好理解的。 重点在forwardforward 是forward到所有的 shell中运行的 而不是使自己stop...要记住,你自己是一个shell...
还是忘了有关子进程的一句话,当exec之后,父进程定义的信号处理函数已经没有用了,但是mask是还有用的??不记得是在哪里看到这句话了。先返回去看看CS61的ppt吧。
test11这里肯定有一些我没有理解的地方这里到底是个么意思? 我什么都没有做结果就是对的哈。
test10记住,jobs是列出所有后台的进程 而不包括前台的进程。重写了listbackgroudjobs。它这里的background jobs 还不单单指BG,还包括ST。是否所有不是FG的全部都为background jobs,暂时这么理解吧!~
test09
竟然是getjobpid(jobs,pid)->state = BG;这句话出了问题 兄弟,你传入的pid是2~ 这个是jid 细心!~细心!~ 细心代表节省时间,兄弟!~
应该用getjobjid这样就对了,不停的跟跟自己说,细心,细心。这样你才能越来越快哈!~
我想把 char *buf= "%234" 这个后面的数字给弄出来,是不是就 atoi(buf+1)即可? 确实是可以的。
是在哪里执行的前台命令? 在builtin_cmd中一边判断的时候就一边做了哈~
为什么tsh> bg %2 的argv[1]是个空的?? 那是因为你单独运行bg的时候木有加参数!
test08收到SIGTSTP之后应该就变成后台程序了吧? 如果完成这一转换? 仅仅操作job list吧 在deletejob前面加了一个判断,这样过了test08
waitpid 被信号SIGTSTP中断之后,返回的时候应该继续waitpid吧
void do_bgfg(char **argv) { return;}这个函数怎么去填咧?在eval里面不是已经进行fork了。先不管嘞。
extern char **environ; /* defined in libc */然后就直接可以用?? environ[0]竟然是GDM_KEYBOARD_LAYOUT=us??完全糊涂了
if (execve(argv[0], argv, environ) < 0) 不用赋个值什么的??
/bin/echo tsh> quit 这个是个什么执行过程??为什么什么输出都没得??
if ((pid = Fork()) == 0) { printf("exec %s\n",argv[0]); if (execve(argv[0], argv, environ) < 0) { printf("%s:Command not found.\n",argv[0]); exit(0); }}为什么就没有输出到终端上面去??
/bin/echo -e tsh> ./myspin 2 \046./myspin 2 &
第一行是个什么东西?为什么第二行它程序一开始就输出真正的命令就是第二行的??第一行是胡扯的??
我暂时仅仅将background job加入了job列表哈~
它的echo也算前台程序哈,这样加的话,jobs会变的很多哈。怎么解决这一个问题呢?
前台程序执行完了之后,自己要马上要deletejob才能完成监控撒
./myspin 4 为什么会出现这个错误./myspin: line 1: tsh:找不到命令myspin.c 里面根本没有涉及tsh的东西哈 myspin当成一个脚本了???确实没有编译成可执行文件,make clean 之后再 make 就OK了
在函数void sigint_handler(int sig)里面不加exit(0) 就仅仅将SIGINT only to foreground job在test07中,截获了SIGINT,我完全什么时候都没有,但是它前端的job还是被clean了,不知道是什么回事情,是否是它休眠的时间到了,然后被deletejob了??pause 和 wait 都可以等待信号?是不是wait的时候接到了SIGINT,它就跳到信号处理的程序,然后就直接运行下一条程序而不是继续回到wait状态??这个是时间到了自己退出的
确实不要exit0的话就仅仅把前端运行的程序搞死了,但是shell的过程建在。
/* clearjob - Clear the entries in a job struct */void clearjob(struct job_t *job) { job->pid = 0; job->jid = 0; job->state = UNDEF; job->cmdline[0] = '\0';}
/* initjobs - Initialize the job list */void initjobs(struct job_t *jobs) { int i;
for (i = 0; i < MAXJOBS; i++) clearjob(&jobs[i]);}
/* maxjid - Returns largest allocated job ID */int maxjid(struct job_t *jobs) { int i, max=0;
for (i = 0; i < MAXJOBS; i++) if (jobs[i].jid > max) max = jobs[i].jid; return max;}
/* addjob - Add a job to the job list */int addjob(struct job_t *jobs, pid_t pid, int state, char *cmdline) { int i; if (pid < 1) return 0;
for (i = 0; i < MAXJOBS; i++) { if (jobs[i].pid == 0) { jobs[i].pid = pid; jobs[i].state = state; jobs[i].jid = nextjid++; if (nextjid > MAXJOBS) nextjid = 1; strcpy(jobs[i].cmdline, cmdline); if(verbose){ printf("Added job [%d] %d %s\n", jobs[i].jid, jobs[i].pid, jobs[i].cmdline); } return 1; } } printf("Tried to create too many jobs\n"); return 0;}
/* deletejob - Delete a job whose PID=pid from the job list */int deletejob(struct job_t *jobs, pid_t pid) { int i;
if (pid < 1) return 0;
for (i = 0; i < MAXJOBS; i++) { if (jobs[i].pid == pid) { clearjob(&jobs[i]); nextjid = maxjid(jobs)+1; return 1; } } return 0;}
/* fgpid - Return PID of current foreground job, 0 if no such job */pid_t fgpid(struct job_t *jobs) { int i;
for (i = 0; i < MAXJOBS; i++) if (jobs[i].state == FG) return jobs[i].pid; return 0;}
/* getjobpid - Find a job (by PID) on the job list */struct job_t *getjobpid(struct job_t *jobs, pid_t pid) { int i;
if (pid < 1) return NULL; for (i = 0; i < MAXJOBS; i++) if (jobs[i].pid == pid) return &jobs[i]; return NULL;}
/* getjobjid - Find a job (by JID) on the job list */struct job_t *getjobjid(struct job_t *jobs, int jid) { int i;
if (jid < 1) return NULL; for (i = 0; i < MAXJOBS; i++) if (jobs[i].jid == jid) return &jobs[i]; return NULL;}
/* pid2jid - Map process ID to job ID */int pid2jid(pid_t pid) { int i;
if (pid < 1) return 0; for (i = 0; i < MAXJOBS; i++) if (jobs[i].pid == pid) { return jobs[i].jid; } return 0;}
/* listjobs - Print the job list */void listjobs(struct job_t *jobs) { int i; for (i = 0; i < MAXJOBS; i++) { if (jobs[i].pid != 0) { printf("[%d] (%d) ", jobs[i].jid, jobs[i].pid); switch (jobs[i].state) { case BG: printf("Running "); break; case FG: printf("Foreground "); break; case ST: printf("Stopped "); break; default: printf("listjobs: Internal error: job[%d].state=%d ", i, jobs[i].state); } printf("%s", jobs[i].cmdline); } }}