了解 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() 和进程通量 的相关文章

随机推荐

  • 为什么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