热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

正确使用fork,wait,exit等-Correctusageoffork,wait,exit,etc

IhavethisproblemtosolvethatIhavenoideahowtodoitbecausetheresonlyafewsystemcall

I have this problem to solve that I have no idea how to do it because there's only a few system calls we can use to solve it and I don't see how they are helpful for the situation.

我有这个问题要解决,我不知道怎么做,因为只有少数系统调用,我们可以用它来解决它,我不知道它们如何对这种情况有所帮助。

The Exercise:
I have matrix with size [10][1000000] with integers and for each line I create a new process with fork(). The idea of each process is to go through all the numbers for that specific line and find a specific number then print a message about it. This was the first step of the problem and it's done. The second step is to print the total of occurrences of that number on each line by order. And in the end, the grand total of occurrences of that number.

练习:我的矩阵大小为[10] [1000000],带有整数,对于每一行,我用fork()创建一个新进程。每个过程的想法是遍历该特定行的所有数字并找到特定的数字然后打印有关它的消息。这是问题的第一步,已经完成了。第二步是按顺序打印每行的出现次数。最后,这个数字的总发生次数。

The Calls:
The system calls I can use are described like this in the document for this exercise:

呼叫:我可以使用的系统调用在本练习的文档中描述如下:

  • pid_t fork(void);
  • void exit(int status);
  • void exit(int status);

  • pid_t wait(int *status);
  • pid_t wait(int * status);

  • pid_t waitpid(pid_t pid, int *status, int options);
  • pid_t waitpid(pid_t pid,int * status,int options);

The Problem:
I have no idea how to do it because the exit() call only allows me to pass a number below 256, what if the number of occurrences is larger than this number? How shall I return such a number?

问题:我不知道怎么做,因为exit()调用只允许我传递一个低于256的数字,如果出现次数大于这个数字怎么办?我该怎么回复这个号码?

Another Problem:
I don't exactly understand the difference between wait() and waitpid() and how/where to use one over the other. Besides the man pages, are there any more documentation where I can see code examples and such to understand them better? Or can someone explain me the differences and provide a basic example demonstrating such differences?

另一个问题:我并不完全理解wait()和waitpid()之间的区别以及如何/在哪里使用一个而不是另一个。除了手册页,还有更多文档,我可以看到代码示例,以便更好地理解它们吗?或者,有人可以解释我的差异,并提供一个证明这种差异的基本例子吗?

2 个解决方案

#1


Use waitpid() to garner the exit statuses of the child processes in sequence; using wait() makes no guarantee about the sequence in which the child corpses will be retrieved.

使用waitpid()按顺序获取子进程的退出状态;使用wait()不能保证检索子尸体的顺序。

On Unix, the exit status is limited to 8 bits, which can be treated as signed or unsigned by the program retrieving the data. You also get an 8 bit value identifying the signal number and core dump status of the terminated child. AFAIK, either the status or the signal bits are always zero (and often both - when the process exits successfully).

在Unix上,退出状态限制为8位,可以通过检索数据的程序将其视为有符号或无符号。您还可以获得一个8位值,用于标识已终止子项的信号编号和核心转储状态。 AFAIK,状态或信号位始终为零(通常两者都是 - 当进程成功退出时)。

If you don't know that the numbers to be returned are smaller than 256, then exit status is not the way to go. As others have said, you have to use some other IPC in that case. If the only system calls permitted are those, then you have to conclude that the values will be less than 255, or that overflows don't matter. Neither is satisfactory as a conclusion outside a homework exercise, but in the 'real world', you are not limited to just 4 system calls either.

如果您不知道要返回的数字小于256,则退出状态不是可行的方法。正如其他人所说,在这种情况下你必须使用其他一些IPC。如果允许的唯一系统调用是那些,那么你必须得出结论,这些值将小于255,或者溢出无关紧要。作为家庭作业之外的结论,两者都不令人满意,但在“现实世界”中,您不仅限于4个系统调用。

See also Exit codes bigger than 255?. Note that on Windows, the range of exit codes is much larger - but you don't use the system calls listed in the question.

另请参阅大于255的退出代码?请注意,在Windows上,退出代码的范围要大得多 - 但您不使用问题中列出的系统调用。


Observation: when I do exit(1), the value in status from wait() is 256; is there a reason for that?

观察:当我退出(1)时,来自wait()的状态值为256;这是有原因的吗?

Answer: yes. The low 8 bits of the status word encode the signal number and so on; the high 8 bits of the (16-bit) status word encode the exit status.

答:是的。状态字的低8位编码信号编号,依此类推; (16位)状态字的高8位编码退出状态。

See and macros WIFEXITED(), WEXITSTATUS(), etc.

请参阅 和宏WIFEXITED(),WEXITSTATUS()等。

#2


I think what you are doing should work fine - just return the number of occurrences as the exit code from the process.

我认为你正在做的事应该可以正常工作 - 只需将出现次数作为退出代码从流程中返回。

You mention that exit() will only allow numbers below 256. I highly doubt if this is the case, but it would be simple enough for you to write a test program to find out for sure.

你提到exit()只允许低于256的数字。我非常怀疑是否是这种情况,但你可以很简单地编写一个测试程序来确定。

Sounds like this is really just a simplified version of Map-Reduce. You might want to have a look at that algorithm as well for some ideas on how you could further parallelize the program - and maybe get some extra credit :)

听起来像这只是Map-Reduce的简化版本。你可能想看看那个算法以及关于如何进一步并行化程序的一些想法 - 并且可能得到一些额外的功劳:)

As for the difference between wait() and waitpid() - if you just want to wait for any of your child processes to complete, you would use wait(). If you want to wait only for a specific child process or if you wanted to just check if a child process has exited without hanging, you would use waitpid().

至于wait()和waitpid()之间的区别 - 如果你只想等待任何子进程完成,你可以使用wait()。如果您只想等待特定的子进程,或者只是想检查子进程是否已经退出而没有挂起,那么您将使用waitpid()。


推荐阅读
  • 本文详细介绍了如何在Linux系统中搭建51单片机的开发与编程环境,重点讲解了使用Makefile进行项目管理的方法。首先,文章指导读者安装SDCC(Small Device C Compiler),这是一个专为小型设备设计的C语言编译器,适合用于51单片机的开发。随后,通过具体的实例演示了如何配置Makefile文件,以实现代码的自动化编译与链接过程,从而提高开发效率。此外,还提供了常见问题的解决方案及优化建议,帮助开发者快速上手并解决实际开发中可能遇到的技术难题。 ... [详细]
  • PHP中元素的计量单位是什么? ... [详细]
  • 计算 n 叉树中各节点子树的叶节点数量分析 ... [详细]
  • BZOJ4240 Gym 102082G:贪心算法与树状数组的综合应用
    BZOJ4240 Gym 102082G 题目 "有趣的家庭菜园" 结合了贪心算法和树状数组的应用,旨在解决在有限时间和内存限制下高效处理复杂数据结构的问题。通过巧妙地运用贪心策略和树状数组,该题目能够在 10 秒的时间限制和 256MB 的内存限制内,有效处理大量输入数据,实现高性能的解决方案。提交次数为 756 次,成功解决次数为 349 次,体现了该题目的挑战性和实际应用价值。 ... [详细]
  • Spring Boot 实战(一):基础的CRUD操作详解
    在《Spring Boot 实战(一)》中,详细介绍了基础的CRUD操作,涵盖创建、读取、更新和删除等核心功能,适合初学者快速掌握Spring Boot框架的应用开发技巧。 ... [详细]
  • 本文作为“实现简易版Spring系列”的第五篇,继前文深入探讨了Spring框架的核心技术之一——控制反转(IoC)之后,将重点转向另一个关键技术——面向切面编程(AOP)。对于使用Spring框架进行开发的开发者来说,AOP是一个不可或缺的概念。了解AOP的背景及其基本原理,对于掌握这一技术至关重要。本文将通过具体示例,详细解析AOP的实现机制,帮助读者更好地理解和应用这一技术。 ... [详细]
  • Jedis接口分类详解与应用指南
    本文详细解析了Jedis接口的分类及其应用指南,重点介绍了字符串数据类型(String)的接口功能。作为Redis中最基本的数据存储形式,字符串类型支持多种操作,如设置、获取和更新键值对等,适用于广泛的应用场景。 ... [详细]
  • voc生成xml 代码
    目录 lxmlwindows安装 读取示例 可视化 生成示例 上面是代码,下面有调用示例 api调用代码,其实只有几行:这个生成代码也很简 ... [详细]
  • 探索JavaScript倒计时功能的三种高效实现方法及代码示例 ... [详细]
  • Android ListView 自定义 CheckBox 实现列表项多选功能详解
    本文详细介绍了在Android开发中如何在ListView的每一行添加CheckBox,以实现列表项的多选功能。用户不仅可以通过点击复选框来选择项目,还可以通过点击列表的任意一行来完成选中操作,提升了用户体验和操作便捷性。同时,文章还探讨了相关的事件处理机制和布局优化技巧,帮助开发者更好地实现这一功能。 ... [详细]
  • 如何在Android应用中设计和实现专业的启动欢迎界面(Splash Screen)
    在Android应用开发中,设计与实现一个专业的启动欢迎界面(Splash Screen)至关重要。尽管Android设计指南对使用Splash Screen的态度存在争议,但一个精心设计的启动界面不仅能提升用户体验,还能增强品牌识别度。本文将探讨如何在遵循最佳实践的同时,通过技术手段实现既美观又高效的启动欢迎界面,包括加载动画、过渡效果以及性能优化等方面。 ... [详细]
  • 本文将详细介绍在Android应用中添加自定义返回按钮的方法,帮助开发者更好地理解和实现这一功能。通过具体的代码示例和步骤说明,本文旨在为初学者提供清晰的指导,确保他们在开发过程中能够顺利集成返回按钮,提升用户体验。 ... [详细]
  • Android 图像色彩处理技术详解
    本文详细探讨了 Android 平台上的图像色彩处理技术,重点介绍了如何通过模仿美图秀秀的交互方式,利用 SeekBar 实现对图片颜色的精细调整。文章展示了具体的布局设计和代码实现,帮助开发者更好地理解和应用图像处理技术。 ... [详细]
  • 在Spring与Ibatis集成的环境中,通过Spring AOP配置事务管理至服务层。当在一个服务方法中引入自定义多线程时,发现事务管理功能失效。若不使用多线程,事务管理则能正常工作。本文深入分析了这一现象背后的潜在风险,并探讨了可能的解决方案,以确保事务一致性和线程安全。 ... [详细]
  • 在 Android 开发中,通过合理利用系统通知服务,可以显著提升应用的用户交互体验。针对 Android 8.0 及以上版本,开发者需首先创建并注册通知渠道。本文将详细介绍如何在应用中实现这一功能,包括初始化通知管理器、创建通知渠道以及发送通知的具体步骤,帮助开发者更好地理解和应用这些技术细节。 ... [详细]
author-avatar
万宝盛华猎头
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有