了解 fork()、sleep() 和进程通量

2023-12-08

一直在练习这些系统调用,但我坚持使用这段代码:

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

main()
{
    pid_t pid;
    switch(pid = fork())
    {
        case -1:
            printf("fork failed");
            break;
        case 0:  //first child
            printf("\ni'm the first child, my pid is %d", getpid());
            fflush(stdout);
            break;
        default:    //parent
            sleep(5); /** sleep is generating problems **/
            printf("\ni'm the parent process, my pid is %d", getpid());
            printf("\ngenerating a new child");
            fflush(stdout);
            switch(pid = fork())
            {
                case -1:
                    printf("fork failed");
                    break;
                case 0: //second child
                    printf("\nhere i am, the second child, my pid is %d", getpid());
                    break;
                default:  //parent
                    wait((int *)0);
                    printf("\nback to parent, my pid is %d", getpid());
            }
    }

    return 0;
}

我得到的输出是:


i'm the first child, my pid is 6203
i'm the parent process, my pid is 6202
generating a new child
back to parent, my pid is 6202
Process returned 0 (0x0)   execution time: 5.004 s
Press ENTER to continue

here i am, the second child, my pid is 6204  

我正在尝试的是这些消息的简单打印,通过管理时间sleep()。 我不明白为什么程序在打印第二条子消息之前返回。 默认情况(第二个分叉之后的那个)在其子项(第二个)作用于输出之前被打印,就像他忽略了它一样wait()。因此,它的子进程在进程返回后被打印。

我无法弄清楚出了什么问题。我已经标记了 sleep() 函数,因为如果我用它替换它wait((int *)0);流程流量按照其设计的方式运行(无论如何,没有任何时间安排)。 此时,我不再确定进程流量或 sleep() 用法(手册页没有那么有用,说实话太简洁了)。


事实上,你的等待电话有效。它检测第一个子进程的结束并随后继续。如果连续调用两次 wait(),您将得到正确的行为。

更新的测试代码:

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

main()
{
    pid_t pid;
    int status;
    switch(pid = fork())
    {
        case -1:
            printf("fork failed");
            break;
        case 0:  //first child
            printf("\ni'm the first child, my pid is %d", getpid());
            fflush(stdout);
            break;
        default:    //parent
            sleep(5); /** sleep is generating problems **/
            printf("\ni'm the parent process, my pid is %d", getpid());
            printf("\ngenerating a new child");
            fflush(stdout);
            switch(pid = fork())
            {
                case -1:
                    printf("fork failed");
                    break;
                case 0: //second child
                    printf("\nhere i am, the second child, my pid is %d", getpid());
                    break;
                default:  //parent
                    pid = wait(&status);
                    printf("\nParent detects process %d was done", pid);
                    pid = wait(&status);
                    printf("\nParent detects process %d was done", pid);
                    printf("\nback to parent, my pid is %d", getpid());
            }
    }

    return 0;
}

Output :

i'm the first child, my pid is 30897
i'm the parent process, my pid is 30896
generating a new child

here i am, the second child, my pid is 30940
Parent detects process 30897 was done
Parent detects process 30940 was done
back to parent, my pid is 30896
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

了解 fork()、sleep() 和进程通量 的相关文章

  • 格式说明符%02x

    我有一个简单的程序 include
  • Gearman,php 扩展问题:使用终端在 .. 中找不到类“GearmanWorker”,但可以在浏览器上使用

    我最近在 ubuntu 10 04 上安装了 gearman 并安装了它的 pecl 扩展 现在 当我在浏览器中运行一个 php 文件时 其中包含 client new GearmanWorker die var Dump client I
  • 为什么这个 makefile 在“make clean”上执行目标

    这是我当前的 makefile CXX g CXXFLAGS Wall O3 LDFLAGS TARGET testcpp SRCS main cpp object cpp foo cpp OBJS SRCS cpp o DEPS SRCS
  • Makefile 和 .Mak 文件 + CodeBlocks 和 VStudio

    我对整个 makefile 概念有点陌生 所以我对此有一些疑问 我正在 Linux 中使用 CodeBlocks 创建一个项目 我使用一个名为 cbp2mak 的工具从 CodeBlocks 项目创建一个 make 文件 如果有人知道更好的
  • Linux 上的 RTLD_LOCAL 和dynamic_cast

    我们有一个由应用程序中的一些共享库构成的插件 我们需要在应用程序运行时更新它 出于性能原因 我们在卸载旧插件之前加载并开始使用新插件 并且只有当所有线程都使用旧插件完成后 我们才卸载它 由于新插件和旧插件的库具有相同的符号 我们dlopen
  • LinkLabel 无下划线 - Compact Framework

    我正在使用 Microsoft Compact Framework 开发 Windows CE 应用程序 我必须使用 LinkLabel 它必须是白色且没有下划线 因此 在设计器中 我将字体颜色修改为白色 并在字体对话框中取消选中 下划线
  • 条件类型定义

    如果我有一小段这样的代码 template
  • C# 获取数据表中所有重复行的计数

    我通过运行存储过程来填充数据集 并且从数据集中填充数据表 DataSet RawDataSet DataAccessHelper RunProcedure storedprocedureName this will just return
  • 如何在多线程应用程序中安全地填充数据并 Refresh() DataGridView?

    我的应用程序有一个 DataGridView 对象和一个 MousePos 类型的列表 MousePos 是一个自定义类 它保存鼠标 X Y 坐标 类型为 Point 和该位置的运行计数 我有一个线程 System Timers Timer
  • MySQL 连接器 C++ 64 位在 Visual Studio 2012 中从源代码构建

    我正在尝试建立mySQL 连接器 C 从源头在视觉工作室2012为了64 bit建筑学 我知道这取决于一些boost头文件和C 连接器 跑步CMake生成一个项目文件 但该项目文件无法编译 因为有一大堆非常令人困惑的错误 这些错误可能与包含
  • 读取依赖步行者输出

    I am having some problems using one of the Dlls in my application and I ran dependency walker on it i am not sure how to
  • 以编程方式创建 Blob 存储容器

    我有一个要求 即在创建公司时 在我的 storageaccount 中创建关联的 blob 存储容器 并将容器名称设置为传入的字符串变量 我已尝试以下操作 public void AddCompanyStorage string subDo
  • 使用 gcc 时在头文件中查找定义的好方法是什么?

    在使用 gcc 时 有人有推荐的方法在头文件中查找定义吗 使用 MSVC 时 我只需右键单击并选择 转到定义 这非常好 我使用过 netbeans gcc 它确实有代码帮助 包括到定义的超链接 所以这是一种选择 但是 我想知道是否有任何其他
  • 在哪里可以找到 Microsoft.Build.Utilities.v3.5

    如何获取 Microsoft Build Utilities v3 5 我正在使用 StyleCop 4 7 Stylecop dll 中的 StyleCop msbuild 任务似乎依赖于 Microsoft Build Utilitie
  • 调用 .ToArray() 时出现 ArgumentException

    我有一个经常被清除的列表 代码完全是这样的 VisitorAgent toPersist List
  • 如何在C#中控制datagridview光标移动

    我希望 datagridview 光标向右移动到下一列 而不是在向单元格输入数据后移动到下一行 我试图通过 dataGridView1 KeyDown 事件捕获键来控制光标 但这并不能阻止光标在将数据输入到单元格后移动到下一行 提前感谢你的
  • winform c# 中的弹出窗口

    我正在开发一个需要弹出窗口的项目 但问题是我还希望能够通过表单设计器在此弹出窗口中添加文本框等 所以基本上我有一个按钮 当您单击它时 它将打开我在表单设计器中设计的另一个窗口 我一直在谷歌搜索 但还没有找到我需要的东西 所以我希望你们能帮助
  • 从后面的代码添加外部 css 文件

    我有一个 CSS 文件 例如 SomeStyle css 我是否可以将此样式表文档从其代码隐藏应用到 aspx 页面 您可以将文字控件添加到标头控件中 Page Header Controls Add new System Web UI L
  • 如何为有时异步的操作创建和实现接口

    假设我有数百个类 它们使用 计算 方法实现公共接口 一些类将执行异步 例如读取文件 而实现相同接口的其他类将执行同步代码 例如将两个数字相加 为了维护和性能 对此进行编码的好方法是什么 到目前为止我读到的帖子总是建议将异步 等待方法冒泡给调
  • 嵌入式linux编写AT命令

    我在向 GSM 模块写入 AT 命令时遇到问题 当我使用 minicom b 115200 D dev ttySP0 term vt100 时它工作完美 但我不知道如何在 C 代码中做同样的事情 我没有收到任何错误 但模块对命令没有反应 有

随机推荐

  • 为什么Golang创建切片时会有CAPACITY参数

    这是一个非常简单的问题 If the capacityGolang中的一个切片的容量是可以被超出的 为什么首先要有一个容量参数呢 我认为这与内存管理 某种 知道在内存中分配切片的位置 但我不确切知道 If the capacityGolan
  • MSChart 轴线

    如何显示图表中每个条形的轴线 我只有第二个 第四个 替代文本 http img35 imageshack us img35 6106 chartiu png 我找到了答案 chartArea AxisX MajorGrid Interval
  • 控制 ggparcoord 中的颜色(来自 GGally 包)

    我正在尝试对特定 ggparcoord 图硬编码所需的线条颜色 例如 当我创建下面的 ggparcoord 图时 library GGally x data frame a runif 100 0 1 b runif 100 0 1 c r
  • Bash - 查找匹配的文件对[重复]

    这个问题在这里已经有答案了 我的文件夹中有很多文件 Filename1 mp4 Filename2 mp4 Filename3 mp4 Etc 以及许多名称添加后缀的文件 Filename1 x264 mp4 Filename2 x264
  • 脚本无法正确接收 url

    我正在使用组合的批处理和java脚本 我发现使用批处理文件从网站检索html 而我们解决的一个问题是没有返回所需的输出 就像我在firefox中使用url时出现的那样 我用来拉取 html 的脚本是 if This IsBatch then
  • 我应该如何循环遍历依赖于前一个循环值的异步函数?

    我试图在 node js 中执行的操作的同步版本 为了可读性而简化 var value null var allValues do value getValue value load the next value if value allV
  • iframe 中的在新窗口中打开链接

    我的页面上有一个 iframe 并且有一个链接 在同一域上 我想在新的物理窗口中打开 当我使用 target blank 时 它只是使用新的 iframe 重新加载页面 我还尝试了这个 JavaScript jQuery 代码 docume
  • 带有用户单击所选组件的动态选项卡

    我正在尝试设置一个选项卡系统 允许组件自行注册 带有标题 第一个选项卡就像一个收件箱 有很多操作 链接项可供用户选择 并且每次单击都应该能够在单击时实例化一个新组件 操作 链接来自 JSON 然后 实例化的组件会将其自身注册为新选项卡 我不
  • Swagger 多个示例未显示

    当我将示例添加到我的 swagger 文档中并在 swagger 编辑器上测试它时 它永远不会显示在任何地方 有人能给我一个例子 说明多个示例实际上在任何地方显示吗 Here is an example of how multiple ex
  • 我想设置每天不同时间触发的重复闹钟

    我需要每天日出时触发闹钟 我得到的日出时间是这样的 06 55 Location location new Location latitude longitude SunriseSunsetCalculator calculator new
  • 安卓:撤销权限

    再会 我正在尝试制作捕获图像然后将其显示在 gridview 中的应用程序 但是当我单击按钮开始捕获时出现此错误 Logcat java lang SecurityException Permission Denial starting I
  • 如何让所有 .py 文件通过 Spyder 启动?

    我使用 Anaconda 安装了 Spyder 并且可以使用开始菜单 Win10 中的 Spyder 图标启动 IDE 我想设置我的首选项以打开所有 py文件与 Spyder 所以我按照 Spyder 开始菜单按钮找到可执行文件 pytho
  • 使用 JavaScript 检查 HTML 片段是否有效

    我需要一个可靠的 JavaScript 库 函数来检查我可以从代码中调用的 HTML 片段是否有效 例如 它应该检查打开的标签和引号是否闭合 嵌套是否正确等 我不希望验证失败 因为某些东西不是 100 标准 但无论如何都会起作用 Updat
  • 矩阵求幂方法JAVA

    我很难创建一种方法来提高矩阵的幂 我尝试使用这个 public static int powerMethod int matrix int power int temp matrix for int i power i 1 i temp t
  • 在Excel中将大时间格式转换为小数

    我正在尝试将 Excel 中的大时间值转换为小时的十进制数 我目前有一列为呼叫中心添加了 就绪时间 总和为 3545 20 02 我现在希望以十进制格式显示相同的时间 例如3545 333 因为它用于另一个计算 作为参考 当我将上述时间转换
  • 如何在 Windows 10 和 Python 3.8 上安装适用于 C# (VS2019) 的 Python.NET?

    Python NET的官方网站上说支持Python 3 8 伟大的 现在我有兴趣从用 C NET Framework v4 7 2 开发的应用程序调用现有的 python 3 8 模块 EDITS 由于 Python NET 的作者几乎没有
  • 限制 Github API 只能访问某个用户的一个存储库

    我们有一个 Web 应用程序 它允许用户编写代码并将其存储在我们服务器上的内部 git 存储库中 现在我们希望允许用户与他的 github 存储库共享他的代码 于是我们查阅了github的api文档 找到了通过ouath2的方法 然而 为了
  • 在 VB.NET 中跨表单共享变量的最佳实践

    我需要在 VB NET 中的两个窗体之间共享变量 其中一个是主窗体 另一个是子窗体 我一直在寻找 找到了一些方法 我想用最好的方法来做到这一点 我在下面列出了几个选项 请评论哪一个是最佳选择 在其中一种形式中创建静态 共享变量 并通过以下方
  • JavaScript - 从具有 m 个元素的 n 个数组生成组合[重复]

    这个问题在这里已经有答案了 我在编写代码时遇到困难 无法在 JavaScript 中从 n 个数组 其中有 m 个元素 生成组合 我在其他语言中看到过类似的问题 但答案包含了我不确定如何翻译的语法或库魔法 考虑这个数据 0 1 0 1 2
  • 了解 fork()、sleep() 和进程通量

    一直在练习这些系统调用 但我坚持使用这段代码 include