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。为什么? 的相关文章

随机推荐

  • 相当于 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