郎平 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); }    }}