orange's学习--第十章:exit()和wait()

让进程死亡的系统调用叫做exit(),直译作“退出”,其实它叫“自杀”更贴切,因为exit()通常是由要进程自己调用的,而且调用之后这个进程不是“退出”了,而是干脆消失了(把进程表的进程状态设置成FREE,就不会参与进程调度了)。
那么wait()是干什么的呢?如果你写过shell脚本的话,就很容易理解它的作用。我们执行一个程序之后,有时需要判断其返回值,这个返回值通常是通过$?得到。而你获取$?时,你执行的程序显然已经执行完毕(所以它才有返回值)。容易理解,这个返回值是我们执行的进程返回给shell的。换言之,是子进程返回给父进程的。父进程得到返回值的方法,就是执行一个wait()挂起,等子进程退出时,wait()调用方结束,并且父进程因此得到返回值。

exit()和wait()就是让子进程传递给父进程一个状态值使用的。子进程必须主动调用exit()生成返回值,父进程必须主动调用wait()获取子进程的返回值。为了完成这个功能,需要2个函数配合处理相应的逻辑。

do_exit/do_wait跟msg_send/msg_receive这两对函数是有点类似的,它们最终都是实现一次“握手”。

为配合exit()和wait(),进程又多了两种状态:WAITING和HANGING。如果一个进程X被置了HANGING位,那么X的所有资源都已被释放,只剩一个进程表项还占着。为什么要占着进程表项不释放呢?因为这个进程表项里面有个新成员:exit_status,它记录了X的返回值。只有当X的父进程通过调用wait( )取走了这个返回值,X的进程表项才被释放。
如果一个进程Y被置了WAITING位,意味着Y至少有一个子进程,并且正在等待某个子进程退出。
读者可能会想,如果一个子进程Z试图退出,但它的父进程却没有调用wait(),那Z的进程表项岂不一直占着得不到释放吗?事情的确如此,而且有个名称专门用来称呼像Z这样的进程,叫做“僵尸进程”(zombie)。如果一个进程Q有子进程,但它没有wait()就自己先exit()了,那么Q的子进程不会变成zombie,因为MM会把它们过继给Init,变成Init的子进程。也就是说,Init应该被设计成不停地调用wait( ),以便让Q的子进程们退出并释放进程表项。

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
该 HTML 代码是一个静态网页,如果您需要实现数据更新,需要使用后端技术。一种常见的方式是使用 JavaScript 和 AJAX 技术,通过向后端发送求获取数据,并将数据动态更新到页面上。 具体实现步骤如下: 1. 在后端编写一个 API,用于获取设备运行状态的数据。可以使用 Flask、Django 等框架来实现该 API。 2. 在前端使用 JavaScript 和 AJAX 技术,向后端发送求获取数据。可以使用 jQuery 或原生的 XMLHttpRequest 对象来实现。 3. 在获取到数据后,使用 JavaScript 动态更新页面上对应的元素。可以使用 jQuery 或原生的 DOM 操作方法来实现。 下面是一个简单的示例代码,使用 jQuery 实现数据更新: ``` <!DOCTYPE html> <html> <head> <title>设备运行实况</title> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <style> body { font-family: Arial, sans-serif; background-color: #f7f7f7; } h1 { text-align: center; margin-top: 50px; } table { margin: auto; border-collapse: collapse; border: 1px solid #ddd; width: 80%; } th, td { padding: 12px; text-align: center; border-bottom: 1px solid #ddd; } th { background-color: #4CAF50; color: white; } .status-ok { color: green; font-weight: bold; } .status-warning { color: orange; font-weight: bold; } .status-error { color: red; font-weight: bold; } </style> <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script> <script> $(document).ready(function() { // 定时更新数据 setInterval(function() { $.ajax({ url: '/api/devices', type: 'GET', dataType: 'json', success: function(data) { // 更新数据 $.each(data, function(i, item) { $('#device-' + item.id + '-status').text(item.status); $('#device-' + item.id + '-time').text(item.time); $('#device-' + item.id + '-status').removeClass().addClass('status-' + item.status.toLowerCase()); }); }, error: function(xhr, textStatus, errorThrown) { console.log('Error: ' + errorThrown); } }); }, 5000); // 每隔 5 秒更新一次数据 }); </script> </head> <body> <h1>设备运行实况</h1> <table> <tr> <th>设备名称</th> <th>运行状态</th> <th>最近更新时间</th> </tr> <tr> <td>设备 A</td> <td id="device-1-status" class="status-ok">正常运行</td> <td id="device-1-time">2021-10-01 10:30:00</td> </tr> <tr> <td>设备 B</td> <td id="device-2-status" class="status-warning">运行异常</td> <td id="device-2-time">2021-10-01 11:00:00</td> </tr> <tr> <td>设备 C</td> <td id="device-3-status" class="status-error">停机</td> <td id="device-3-time">2021-10-01 12:11:00</td> </tr> </table> </body> </html> ``` 在上面的示例代码,我们使用了 jQuery 的 `$.ajax` 方法向后端发送 GET 求,获取设备状态的数据。在求成功后,我们使用 `$.each` 方法遍历数据,并更新页面上对应的元素。每隔 5 秒钟更新一次数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值