fork()的执行顺序可以确定吗?

2023-12-06

我正在做教科书“操作系统概念第七版”的练习,我有点困惑如何fork()工作。据我了解,fork()创建一个与其父进程同时运行的子进程。但是,我们如何确切地知道哪个进程首先运行呢?我的意思是执行顺序。

Problem
使用以下命令编写 C 程序fork()在子进程中生成斐波那契数列的系统调用。序列号将在命令行中提供。

这是我的解决方案:

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

void display_fibonacci_sequence( int n ) {
    int i = 0;
    int a = 1;
    int b = 1;
    int value;
    printf( "%d, %d, ", a, b );
    for( ;i < n - 2; ++i ) {
        value = a + b;
        printf( "%d, ", value );
        a = b;
        b = value;
    }
    printf( "\n" );
}

int main( int argc, char** argv ) {
    int n;
    pid_t pid;
    pid = fork();
    if( argc != 2 ) {
        fprintf( stderr, "Invalid arguments" );
        exit( -1 );
    }
    n = atoi( argv[1] );

    if( pid < 0 ) {
        fprintf( stderr, "Fork failed" );
        exit( -1 );
    }
    else if( pid == 0 ) {
        display_fibonacci_sequence( n );
    }
    else { // parent process
        // what do we need to do here? 
    }
}

老实说,我看不出使用之间有什么区别fork并且不使用fork。此外,如果我想要parent处理来自用户的输入,并让child进程处理显示,我该怎么做?


您问了很多问题,我会尽力以方便的顺序回答它们。

第一个问题

老实说,我不认为使用 fork 和不使用 fork 有什么区别 使用叉子。

那是因为这个例子不是一个很好的例子。在您的示例中,父级没有执行任何操作,因此叉子毫无用处。

Second

else {
    // what do we need to do here? 
}

你需要wait(2)让孩子终止。请务必仔细阅读该页面。

Third

我希望父进程处理用户的输入,并让 子进程处理显示

读取分叉前的输入并“处理”里面的显示if (pid == 0)

Fourth

但是,我们如何确切地知道哪个进程首先运行呢?

很少有程序应该关心这个问题。你无法知道执行的顺序,它完全取决于环境。 TLPI 是这样说的:

在 fork() 之后,不确定是父进程还是子进程 子级——下一个可以访问CPU。在多处理器系统上,它们可以同时访问 CPU。

隐式或显式依赖于特定的应用程序 为了获得正确结果的执行顺序是开放 由于竞争条件而失败

也就是说,操作系统可以让您控制这个顺序。例如,Linux 有/proc/sys/kernel/sched_child_runs_first.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

fork()的执行顺序可以确定吗? 的相关文章

  • 自动从 C# 代码进行调试过程并读取寄存器值

    我正在寻找一种方法来读取某个地址的 edx 注册表 就像这个问题中所问的那样 读取eax寄存器 https stackoverflow com questions 16490906 read eax register 虽然我的解决方案需要用
  • 如何在 Unity 中从 RenderTexture 访问原始数据

    问题的简短版本 我正在尝试访问 Unity 中 RenderTexture 的内容 我一直在使用 Graphics Blit 使用自己的材质进行绘制 Graphics Blit null renderTexture material 我的材
  • 为什么 POSIX 允许在只读模式下超出现有文件结尾 (fseek) 进行搜索

    为什么寻找文件结尾很有用 为什么 POSIX 让我们像示例中那样在以只读方式打开的文件中进行查找 c http en cppreference com w c io fseek http en cppreference com w c io
  • C# 中值类型和引用类型有什么区别? [复制]

    这个问题在这里已经有答案了 我知道一些差异 值类型存储在堆栈上 而引用类型存储在托管堆上 值类型变量直接包含它们的值 而引用变量仅包含对托管堆上创建的对象位置的引用 我错过了任何其他区别吗 如果是的话 它们是什么 请阅读 堆栈是一个实现细节
  • C# 用数组封送结构体

    假设我有一个类似于 public struct MyStruct public float a 我想用一些自定义数组大小实例化一个这样的结构 在本例中假设为 2 然后我将其封送到字节数组中 MyStruct s new MyStruct s
  • 当 Cortex-M3 出现硬故障时如何保留堆栈跟踪?

    使用以下设置 基于 Cortex M3 的 C gcc arm 交叉工具链 https launchpad net gcc arm embedded 使用 C 和 C FreeRtos 7 5 3 日食月神 Segger Jlink 与 J
  • 编译的表达式树会泄漏吗?

    根据我的理解 JIT 代码在程序运行时永远不会从内存中释放 这是否意味着重复调用 Compile 表达式树上会泄漏内存吗 这意味着仅在静态构造函数中编译表达式树或以其他方式缓存它们 这可能不那么简单 正确的 他们可能是GCed Lambda
  • 如何在 Team Foundation 上强制发表有意义的签入评论?

    我有一个开发团队有一个坏习惯 他们写道poor签入评论 当我们必须在团队基础上查看文件的历史记录时 这使得它成为一场噩梦 我已经启用了变更集评论政策 这样他们甚至可以在签到时留下评论 否则他们不会 我们就团队的工作质量进行了一些讨论 他们很
  • 是否有比 lex/flex 更好(更现代)的工具来生成 C++ 分词器?

    我最近将源文件解析添加到现有工具中 该工具从复杂的命令行参数生成输出文件 命令行参数变得如此复杂 以至于我们开始允许它们作为一个文件提供 该文件被解析为一个非常大的命令行 但语法仍然很尴尬 因此我添加了使用更合理的语法解析源文件的功能 我使
  • 像“1$”这样的位置参数如何与 printf() 一起使用?

    By man I find printf d width num and printf 2 1 d width num 是等价的 但在我看来 第二种风格应该与以下相同 printf d num width 然而通过测试似乎man是对的 为什
  • 用 C 实现 Unix shell:检查文件是否可执行

    我正在努力用 C 语言实现 Unix shell 目前正在处理相对路径的问题 特别是在输入命令时 现在 我每次都必须输入可执行文件的完整路径 而我宁愿简单地输入 ls 或 cat 我已经设法获取 PATH 环境变量 我的想法是在 字符处拆分
  • C 中的位移位

    如果与有符号整数对应的位模式右移 则 1 vacant bit will be filled by the sign bit 2 vacant bit will be filled by 0 3 The outcome is impleme
  • AccessViolationException 未处理

    我正在尝试使用史蒂夫 桑德森的博客文章 http blog stevensanderson com 2010 01 28 editing a variable length list aspnet mvc 2 style 为了在我的 ASP
  • 什么是 C 语言的高效工作流程? - Makefile + bash脚本

    我正在开发我的第一个项目 该项目将跨越多个 C 文件 对于我的前几个练习程序 我只是在中编写了我的代码main c并使用编译gcc main c o main 当我学习时 这对我有用 现在 我正在独自开展一个更大的项目 我想继续自己进行编译
  • 在 URL 中发送之前对特殊字符进行百分比编码

    我需要传递特殊字符 如 等 Facebook Twitter 和此类社交网站的 URL 为此 我将这些字符替换为 URL 转义码 return valToEncode Replace 21 Replace 23 Replace 24 Rep
  • 将日期参数传递给对 MVC 操作的 ajax 调用的安全方法

    我有一个 MVC 操作 它的参数之一是DateTime如果我通过 17 07 2012 它会抛出一个异常 指出参数为空但不能有空值 但如果我通过01 07 2012它被解析为Jan 07 2012 我将日期传递给 ajax 调用DD MM
  • Bing 地图运行时错误 Windows 8.1

    当我运行带有 Bing Map 集成的 Windows 8 1 应用程序时 出现以下错误 Windows UI Xaml Markup XamlParseException 类型的异常 发生在 DistanceApp exe 中 但未在用户
  • 窗体最大化时自动缩放子控件

    有没有办法在最大化屏幕或更改分辨率时使 Windows 窗体上的所有内容自动缩放 我发现手动缩放它是正确的 但是当切换分辨率时我每次都必须更改它 this AutoScaleDimensions new System Drawing Siz
  • C++ 成员函数中的“if (!this)”有多糟糕?

    如果我遇到旧代码if this return 在应用程序中 这种风险有多严重 它是一个危险的定时炸弹 需要立即在应用程序范围内进行搜索和销毁工作 还是更像是一种可以悄悄留在原处的代码气味 我不打算writing当然 执行此操作的代码 相反
  • 如何将字符串“07:35”(HH:MM) 转换为 TimeSpan

    我想知道是否有办法将 24 小时时间格式的字符串转换为 TimeSpan 现在我有一种 旧时尚风格 string stringTime 07 35 string values stringTime Split TimeSpan ts new

随机推荐

  • EF Code First - 如何设置身份种子?

    我有一个实体类 public class Employee public long Id get set public string Name get set 我已将 Id 字段设置为主键并自动生成编号 modelBuilder Entit
  • 聊天轮盘的架构

    有人可以向我解释一下聊天轮盘背后的架构吗 我正在考虑一个类似的项目 只实现音频 支持 对于初学者 设置闪存服务器的最佳方法是吗 如果是这样 我应该如何进入闪存 我需要 Flex 4 吗 我 有一些 c c 和 java 的初学者经验 但我从
  • 在Java中将mp3转换为wav

    我安装了 mp3spi 以支持使用 javax sound 库读取 Java 8 项目中的 mp3 文件 我现在的目标是将 mp3 写入 wav 文件 然而 结果是不正确的 这是最简单格式的代码 public static void mp3
  • PHP 中修剪 unicode 空格

    我怎样才能修剪string 6 page 其中第一个空格是 0xc2a0 不间断空格 我试过了trim and preg match s s u key m 另一个问题 如何可靠地复制这些字符 它们似乎被转换为 正常 空间 这使得调试变得困
  • 如何动态评估 C# 代码?

    我可以做一个eval something 在 JavaScript 中动态执行代码 有没有办法让我在 C 中做同样的事情 我想做的一个例子是 我有一个整数变量 比如说i 并且我有多个属性 名称为 Property1 Property2 Pr
  • 传递参数后保存文件

    这是家长的问题 将字符串保存到文件我想传递单击按钮后将保存在文件 csv 中的参数 bigtable 是一个每行都有字符串的表 这是我的 show html erb 中的代码 some code here 和我的控制器方法 def save
  • 数组的最小总和分区

    问题陈述 给定一个数组 任务是将其分为两个集合 S1 和 S2 使得它们的总和之间的绝对差最小 输入样本 1 6 5 11 gt 1 这 2 个子集是 1 5 6 and 11 总和是12 and 11 因此答案是1 36 7 46 40
  • 在高图表的最后一点上动态绘制标记

    我想在最后一点上画一个标记 数据源是动态的 看看下面的代码 function btn click function var l chart series 0 points length var p chart series 0 points
  • XSLT 1.0 如何使用 sum() 对带有逗号的值求和 - 在 xpath 中行走

    我有一个 XSLT 1 0 转换要编写 但我没有在网上找到适合我的问题的良好解决方案 我有以下 XML 示例
  • 如何将参数从 JQuery 传递到 ASP.NET webmethod?

    我在下面编写了这个 jQuery ajax 方法 它调用 webmethod 除了作为 User 对象的参数具有空字段之外 调用发生得很好 当我调试时 我可以看到 firebug 中的值 但它们无法访问 webmethod 中的 User
  • C# 在其他线程上执行代码

    我的应用程序中的线程处理遇到一些问题 我有一个多线程客户端 服务器应用程序 我还使用 C MonoDevelop for Unity3d 不确定这对答案是否有任何影响 我将尝试解释我的问题出在哪里 Unity 在单线程上工作 所以如果我想实
  • 使用 NLTK 提取名词和动词

    我有 Django Rest 应用程序和一个模型任务 我对自然处理完全陌生 我想构建一个返回名词和动词列表的函数 它看起来像这样 api view GET def noun verb list request nouns verbs Lis
  • Groovy:Lombok @NoArgsConstructor 未创建默认构造函数

    我在用lombok 1 18 6在我的春季启动项目中 我有 NoArgsConstructor但仍然得到org springframework orm jpa JpaSystemException No default constructo
  • Android - Firestore/Firebase 实时数据库“.info/connected”返回错误的连接状态

    我在应用程序中使用 Firestore Beta 我想检查是否存在与 Firestore 数据库的有效在线连接 文档称 目前没有直接的方法来查询连接状态 但可以使用 Firebase 连接状态作为解决方法 代码片段也可以在文档的这一部分中找
  • AS/400:使用COMPUTE功能,不同字段定义结果不一致

    我在使用 AS 400 中的 COMPUTE 函数时遇到了一个神秘的问题 场景如下 01 WSAA AMOUNT A PIC S9 15 V9 02 COMP 3 01 WSAA AMOUNT B 01 PIC S9 16 V9 02 VA
  • 在 C++ 中创建文件夹

    我最近开始使用 C 工作 当我在执行代码时必须创建目录时遇到了这种情况 当我必须创建一个文件夹时 代码工作正常 但当我必须使用这个新创建的文件夹创建另一个文件夹时 代码会失败 假设 我在C 并想将我的文件存储在C A B 下面的代码使用mk
  • 使用 ncu (NsightComputeCli) 获取 nvprof 默认行为

    默认nvprof输出很棒 但是nvprof已被弃用 取而代之的是ncu 我怎样才能使ncu给我一个看起来更像的输出nvprof 最小工作示例 我有2个range以一种非常不理想的方式调用的函数 仅使用 1 个线程 比其他的需要更长的时间ra
  • 性能:子查询或连接

    我有一个关于子查询 连接另一个表的性能的小问题 INSERT INTO Original Person PID Name Surname SID SELECT ma PID new TBL Name ma Surname TBL SID F
  • 如何执行多个相继完成的 Alamofire 请求?

    我想执行多个 Alamofire 请求 但是 由于数据依赖性 新请求只能在前一个请求完成后才开始 我已经问过一个question一个更一般的异步请求示例 通过以下方法解决OperationQueue 然而 我并没有成功地用 Alamofir
  • fork()的执行顺序可以确定吗?

    我正在做教科书 操作系统概念第七版 的练习 我有点困惑如何fork 工作 据我了解 fork 创建一个与其父进程同时运行的子进程 但是 我们如何确切地知道哪个进程首先运行呢 我的意思是执行顺序 Problem使用以下命令编写 C 程序for