fork()返回0,但是子进程getpid()!=0。为什么?

2024-02-01

这是测试 fork() 系统调用的 C 代码:

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

int main(int argc, char *argv[])
{

    printf("I am: %d\n", (int)getpid());

    pid_t pid = fork();

    printf("fork returned: %d\n", (int)pid);

    if (pid < 0)
    {
        perror("fork failed");  
    }

    if (pid==0)
    {
        printf("I am the child with pid %d\n", (int)getpid());
        sleep(5);
        printf("Child exiting...\n");
        exit(0);
    }

    printf("I am the parent with pid %d, waiting for the child\n", (int)getpid());
    wait(NULL);
    printf("Parent ending. \n");

    return 0;
}

终端的输出是:

I am: 25110
fork returned: 25111
I am the parent with pid 25110, waiting for the child
fork returned: 0
I am the child with pid 25111
Child exiting...
Parent ending. 

问题:什么时候叉子返回:0,它在子进程中。但子进程显示我是pid 25111的孩子。我以为子进程pid应该是0,为什么变成了25111呢?

与父进程相同,叉子返回 25111,但是 getpid() 返回 25110 (我是 pid 25110 的父进程,正在等待子进程)


子进程显示我是pid 25111的子进程。我认为子进程pid应该是0

不。在父级中fork()返回孩子的 pid。在孩子身上,fork返回 0——即not任何东西的 pid,它只是一个标记。子进程 pid 为 25111,如下getpid告诉过你了。

对于父进程,fork 返回 25111,但 getpid() 返回 25110

正确的。父进程 pid 始终为 25110,如下所示getpid告诉过你了。和fork()返回新孩子的 pid。

事实是fork在父级中返回相同的值getpid返回的孩子证明这一切都工作正常。

听起来像你认为的fork()总是返回你所在进程的 pid。但这没有意义——我们已经有了getpid呼吁这一点。

如果你是家长,fork()返回 pidother过程,孩子。如果你是那个孩子,fork()根本不返回 pid。 (如果你是孩子,并且想知道父母的 pid,这是一个很好的、常见的、单独的问题。答案:调用getppid().)

我们可以将这一切总结如下:

                 parent   child
                 ------   -----
pid:              25110   25111
fork returns:     25111       0
getpid returns:   25110   25111
getppid returns:  ?????   25110

记住这一点的方法是考虑将要调用的代码fork():它将做什么,需要知道什么。父母需要知道它是父母。孩子需要知道这是他自己。父进程经常需要知道子进程的 pid(并且没有其他方法获取它)。

If fork总是返回一个pid,然后fork调用,查看它的返回值,您将无法知道您是父级还是子级 - 但这通常是您需要知道的第一个也是最重要的事情。

(在所有这一切中,我忽略了第三种可能性,即fork失败,并在父级中返回 -1,并且在子级中不返回任何内容,因为不存在。)

也可以看看为什么子进程中fork()返回0? https://stackoverflow.com/questions/25718225/why-fork-return-0-in-the-child-process?rq=1 .

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

fork()返回0,但是子进程getpid()!=0。为什么? 的相关文章

  • 在 C++ 中使用 matlab 结构(matlab 函数调用的返回值)(由 matlab 编译器生成的库)

    你好 我有一个相当简单的 matlab 函数 例如 function MYSTRUCT myfunc MYSTRUCT prop1 test MYSTRUCT prop2 foo MYSTRUCT prop3 42 end 我用 matla
  • 在 LINQ 中按 Id 连接多表和分组

    我想按categoryId显示列表产品的名称组 这是我的代码 我想要我的视图显示结果 Desktop PC HP Red PC Dell Yellow PC Asus Red SmartPhone Lumia 720 Blue 我的组模型
  • Nodejs 在循环中等待

    我想循环等待 实现此目的的最佳方法是什么 这是我的实际代码 var groups 461 6726 3284 4 121 11 399 1735 17 19 1614 groups forEach function value myfunc
  • 如何创建包含 IPv4 地址的文本框? [复制]

    这个问题在这里已经有答案了 如何制作一个这样的文本框 我想所有的用户都见过这个并且知道它的功能 您可以使用带有 Mask 的 MaskedTestBox000 000 000 000 欲了解更多信息 请参阅文档 http msdn micr
  • java.io.Serialized 在 C/C++ 中的等价物是什么?

    C C 的等价物是什么java io Serialized https docs oracle com javase 7 docs api java io Serializable html 有对序列化库的引用 用 C 序列化数据结构 ht
  • 使用接口有什么好处?

    使用接口有什么用 我听说它用来代替多重继承 并且还可以用它来完成数据隐藏 还有其他优点吗 哪些地方使用了接口 程序员如何识别需要该接口 有什么区别explicit interface implementation and implicit
  • qdbusxml2cpp 未知类型

    在使用 qdbusxml2cpp 程序将以下 xml 转换为 Qt 类时 我收到此错误 qdbusxml2cpp c ObjectManager a ObjectManager ObjectManager cpp xml object ma
  • Qt - ubuntu中的串口名称

    我在 Ubuntu 上查找串行端口名称时遇到问题 如您所知 为了在 Windows 上读取串口 我们可以使用以下代码 serial gt setPortName com3 但是当我在 Ubuntu 上编译这段代码时 我无法使用这段代码 se
  • 如何在 32 位或 64 位配置中以编程方式运行任何 CPU .NET 可执行文件?

    我有一个可在 32 位和 64 位处理器上运行的 C 应用程序 我试图枚举给定系统上所有进程的模块 当尝试从 64 位应用程序枚举 32 位进程模块时 这会出现问题 Windows 或 NET 禁止它 我认为如果我可以从应用程序内部重新启动
  • 如何在 Xaml 文本中添加电子邮件链接?

    我在 Windows Phone 8 应用程序中有一些大文本 我希望其中有电子邮件链接 例如 mailto 功能 这是代码的一部分
  • C# 中的合并运算符?

    我想我记得看到过类似的东西 三元运算符 http msdn microsoft com en us library ty67wk28 28VS 80 29 aspx在 C 中 它只有两部分 如果变量值不为空 则返回变量值 如果为空 则返回默
  • 为什么 std::strstream 被弃用?

    我最近发现std strstream已被弃用 取而代之的是std stringstream 我已经有一段时间没有使用它了 但它做了我当时需要做的事情 所以很惊讶听到它的弃用 我的问题是为什么做出这个决定 有什么好处std stringstr
  • 将 MQTTNet 服务器与 MQTT.js 客户端结合使用

    我已经启动了一个 MQTT 服务器 就像this https github com chkr1011 MQTTnet tree master例子 该代码托管在 ASP Net Core 2 0 应用程序中 但我尝试过控制台应用程序 但没有成
  • 为什么 gcc 抱怨“错误:模板参数 '0' 的类型 'intT' 取决于模板参数”?

    我的编译器是gcc 4 9 0 以下代码无法编译 template
  • 调用堆栈中的“外部代码”是什么意思?

    我在 Visual Studio 中调用一个方法 并尝试通过检查调用堆栈来调试它 其中一些行标记为 外部代码 这到底是什么意思 方法来自 dll已被处决 外部代码 意味着该dll没有可用的调试信息 你能做的就是在Call Stack窗口中单
  • 方法优化 - C#

    我开发了一种方法 允许我通过参数传入表 字符串 列数组 字符串 和值数组 对象 然后使用这些参数创建参数化查询 虽然它工作得很好 但代码的长度以及多个 for 循环散发出一种代码味道 特别是我觉得我用来在列和值之间插入逗号的方法可以用不同的
  • C++ 条件编译

    我有以下代码片段 ifdef DO LOG define log p record p else define log p endif void record char data 现在如果我打电话log hello world 在我的代码中
  • WebSocket安全连接自签名证书

    目标是一个与用户电脑上安装的 C 应用程序交换信息的 Web 应用程序 客户端应用程序是 websocket 服务器 浏览器是 websocket 客户端 最后 用户浏览器中的 websocket 客户端通过 Angular 持久创建 并且
  • 我的班级应该订阅自己的公共活动吗?

    我正在使用 C 3 0 遵循标准事件模式我有 public event EventHandler
  • 如何从 ODBC 连接获取可用表的列表?

    在 Excel 中 我可以转到 数据 gt 导入外部数据 gt 导入数据 然后选择要使用的数据源 然后在提供登录信息后 它会给我一个表格列表 我想知道如何使用 C 以编程方式获取该列表 您正在查询什么类型的数据源 SQL 服务器 使用权 看

随机推荐

  • 相当于 Akka,但适用于 .NET(并发框架)

    有没有相当于Akka http akka io 但对于 NET http doc akka io use cases http doc akka io use cases 这是 我的 正在进行的 NET Akka actor 端口 编辑 该
  • 如何使用 jquery 检查选​​择元素是否仍然“打开”/活动

    无论如何 我是否可以通过 jQuery 检测选择表单元素当前是否处于活动状态 我创建了这个小提琴来演示这个问题 http jsfiddle net E2PhT 2 http jsfiddle net E2PhT 2 当您将鼠标悬停在 搜索
  • 如何使用 PostgreSQL 计数估计来加速 Django 的管理页面?

    众所周知 当数据库表有很多行时 Django 的管理列表视图会变得相当慢 这是因为 Django 分页器默认使用 慢 PostgreSQLCOUNT query 因为估计对我们来说很好 而且速度要快得多 例如 SELECT reltuple
  • 如何在 OpenCV 中将轮廓分割为开放弧

    I have the image below and I need to split the contour to create various 30 degrees arc which I then need to fit a circl
  • 来自未知来源的 MPI 接收

    我正在 MPI 中实现一个程序 其中主进程 等级 0 应该能够接收来自其他进程的请求 这些进程要求只有根才知道的变量值 如果我按等级 0 进行 MPI Recv 我必须指定向根发送请求的进程的等级 但我无法控制它 因为进程不按顺序运行 1
  • 即使设置为原始值,angular2 formcontrol 仍保持脏状态

    当我更改输入字段中的值时 相应的表单控件将设置为脏 当我恢复更改 通过在输入字段中键入 时 表单控件保持脏状态 这是有意为之 这是一个错误还是我做错了什么 嗯 是的 它本来就是这样工作的 因为 一个控制是dirty如果用户已经改变UI 中的
  • java中@符号是什么意思?

    我知道它在出于文档目的的评论中意味着什么 但除此之外它意味着什么 我通常会用谷歌搜索这个 但每个非字母符号都会出现在结果中 The 符号表示 Java 注释 Java 注释的作用是向变量 方法 类 接口或其他语言元素添加特殊属性 这可以在声
  • ActiveRecord 迁移中序列化列的默认值

    所以我有一个序列化列 dimensions 在我的迁移中 我想将该字段设置为默认哈希 我努力了 create table shipping profiles do t t string dimensions in default gt wi
  • 默认情况下,stdout 行是缓冲的、无缓冲的还是不确定的?

    Section 7 19 3 7 of c99指出 在程序启动时 预定义了三个文本流 无需显式打开 标准输入 用于读取常规输入 标准输出 用于写入常规输出 和标准错误 用于写入诊断输出 最初打开时 标准错误流未完全缓冲 当且仅当可以确定标准
  • JObject.Parse 修改浮点值的结尾

    var clientString max 1214 704958677686 JObject o JObject Parse clientString var jsonString o ToString jsonString 的内容 max
  • C++ 重构 - 将方法移至实现文件

    我有很多头文件 里面有很长的方法实现 有没有一种自动的方法来做到这一点 一个接一个可能会花费很多时间 Thanks 如果您使用的是 Visual Studio 有一个名为视觉辅助 http www wholetomato com 这可以帮助
  • C++:如何从外部调用父类函数

    I have class A public virtual void foo class B public A public void foo B ptr new B 我想给A打电话foo 直接使用 ptr 指针 当我尝试时 A ptr g
  • 秋季创作者更新性能问题

    最近的 Windows 10 更新 秋季创意者更新 之后 我们的 NET c 4 0 应用程序的性能下降了很多 我认为存在各种问题 其中之一是 log4net 或磁盘 IO 我们的应用程序非常复杂 各种 WCF 应用程序和 ASPNET M
  • 经典 ASP 中的 CURL 请求

    有人可以帮我从下面的 CURL 请求创建经典的 asp 代码吗 curl H Authorization Token f2210dacd9c6ccb8133606d94ff8e61d99b477fd https cloud seafile
  • JDBC 连接池未在 Tomcat 中重新打开连接

    我已将 Tomcat 设置为使用连接池 但在连接上的 MySQL 超时后 之前在池中打开的连接不会打开 我的 context xml 文件如下所示
  • 如何在最新的.NET Core工具中实现版本自动递增?

    我正在使用最新的 截至今天 NET Core 工具 在那里 您可以在 MSBuild 属性中指定版本 但是 与 assembly AssemblyVersion 不同 这似乎不支持通配符 如何以同样的方式自动增加版本 解释为什么这是一个坏主
  • 基于LSB-DCT的图像隐写术

    我正在研究基于 LSB DCT 的图像隐写术 其中我必须将 LSB 应用于图像的 DCT 系数 以便将数据嵌入到 JPEG 我对这一切都很陌生 所以搜索并阅读了一些研究论文 他们都缺乏很多有关 DCT 之后流程的信息 i 也在 stacko
  • grep - 如何输出进度条或状态

    有时我是grep 处理数千个文件 很高兴看到某种进度 栏或状态 我知道这不是小事 因为grep将搜索结果输出到STDOUT我的默认工作流程是将结果输出到文件中 并希望将进度条 状态输出到STDOUT or STDERR 这是否需要修改源代码
  • 如何获取页面上所有选中复选框的计数

    我想计算用户选择了多少个复选框 例如 从一组 10 个复选框中 如果他选择了 5 个 那么我希望能够对其进行计数 使用线路 checkbox checked 我可以选择所有选中的复选框 是否有办法获取该语句返回的所有元素的计数 Use th
  • fork()返回0,但是子进程getpid()!=0。为什么?

    这是测试 fork 系统调用的 C 代码 include