目录
一.任务一:
1.比较trace09~10执行不同结果:
①trace09:
先在后台运行myspin 4,然后在前台运行myspin 5,接着休眠2s,发出TSTP信号使得前台进程挂起并成为后台进程,
jobs输出结果
make rtest09和make test09中都有下面的输出,myspin 4仍然在后台运行,myspin 5被stopped
[1] (3448) Running ./myspin 4 &
[2] (3450) Stopped ./myspin 5
接着bg %2让后台的作业2继续在后台执行,jobs输出结果:
make rtest09中:作业5在后台恢复运行
[1] (3448) Running ./myspin 4 &
[2] (3450) Running ./myspin 5
make test09中:作业5仍然在后台挂起
[1] (3459) Running ./myspin 4 &
[2] (3461) Stopped ./myspin 5
②trace10:
先在后台运行myspin 4,然后休眠1s,fg %1在前台运行作业1,再休眠1s,发出TSTP信号,前台作业被挂起,放到了后台。jobs输出:
rtest10: myspin 4在后台被挂起
[1] (3482) Stopped ./myspin 4 &
test10: 没有输出(说明后台此时没有作业)
然后fg %1使得作业1在前台继续运行,jobs输出:
rtest10:无(没有后台进程)
test10:作业1仍然在后台运行,而且在此之前的fg被警告没有对应的命令
[1] (3492) Running ./myspin 4 &
2.实现do_bgfg内建函数:
do_bgfg需要实现的功能:
fg <job>: job是后台运行或者挂起的作业,变为前台的运行作业
bg <job>: job是挂起的后台作业,变为后台的运行作业
代码:
①do_bgfg:
- 先判断是jid还是pid(根据第一个字母是不是‘%’
- 根据jid/pid获得进程jod_t对象
- 调用kill函数向前台进程发送SIGCONT信号
- 根据"bg"、"fg"判断是否是后台进程,如果是更改进程的状态state为BG
- 如果不是后台进程,更改状态为FG,然后调用waitfg函数等待前台进程的结束
结果:
二、任务二
验证Trace11~15并解释与记录
trace11:
先调用mysplit 4睡眠四秒,然后SLEEP 2睡眠2秒,接下来INT信号终止前台进程,再调用/bin/ps a显示当前进程的状态
trace12
先调用mysplit 4睡眠4秒,然后SLEEP 2睡眠2秒,接着发送信号TSTP停止前台进程,然后jobs显示后台进程,最后/bin/ps a显示进程的行程
trace13:
首先调用mysplit 4睡眠4秒,然后SLEEP 2睡眠2秒,接着发送TSTP信号停止前台进程,jobs显示后台进程,/bin/ps a显示进程的行程,fg %1将jid=1的作业调到前台运行,最后/bin/ps a显示进程的行程
trace14:
- 前三行打印文字,然后调用./bogus指令,然后在后台调用mysplit函数睡眠4秒,再调用fg命令,再调用bg命令
- 再调用fg a命令,再调用bg a命令,然后调用fg999999命令,然后调用bg999999命令,再调用fg%2命令,将当前在后台的作业二移动到前台,再调用fg%1命令,将当前在后台的作业一移动到前台
- 然后调用sleep命令睡眠2秒,然后调用TSTP指令打印,再调用bg%2命令,将当前在后台的作业二运行
- 再调用bg %1命令,将当前在后台的作业一运行,最后调用jobs指令打印当前在后台的作业
trace15:
- 前三行打印文字,然后调用myspin函数睡眠10秒,再调用sleep命令睡眠2秒,再调用INT指令打印
- 然后在后台调用myspin函数睡眠3秒,再在后台调用myspin函数睡眠4秒,然后调用jobs指令打印当前在后台的作业
- 然后调用指令fg%1命令,将当前在后台的作业一移动到前台,再调用sleep指令睡眠2秒,然后调用TSTP指令打印
- 然后调用jobs指令打印当前在后台的作业,再调用bg%3命令,将当前在后台的作业三运行,再调用bg%1命令,将当前在后台的作业一运行
- 然后调用jobs指令打印当前在后台的作业,然后调用指令fg%1命令,将当前在后台的作业一移动到前台,最后调用quit指令退出