【问题标题】:what will be the PID after fork()?fork() 之后的 PID 是多少?
【发布时间】:2011-06-27 11:39:51
【问题描述】:

我在 C 程序中连续执行 3 次分叉。
1. 它会以相同的顺序执行吗? (我的猜测是肯定的)。
2. 如果我从 shell 执行pgrep myexecutable,它会按照与启动时相同的顺序提供进程 ID 吗? (我的猜测是没有,因为你不能保证系统给孩子什么pid,对吧?)

【问题讨论】:

  • 对于任何合理的程序来说都没有关系。
  • 最后一个分叉进程的PID是$!stackoverflow.com/a/25361436/6655092...我在实际寻找$!时发现了这个问题,所以我想我会在这里发布。

标签: pid fork


【解决方案1】:

执行 3 次 fork 后总共有 8 个进程在运行

所以现在 pid 将取决于创建子进程的顺序以及创建子进程的子进程的顺序。

可能是这样的

main - 12345

child1_of_main_after_fork1  12346

child2_of_child1_after_fork2  12347

child3_of_main_after_fork2 12348

child4_of_main_after_fork3 12349

child5_of_child1_after_fork3 12350

child6_of_child2_after_fork3 12351

child7_of_child3_after_fork3 12352

【讨论】:

    【解决方案2】:

    Shrinath,你应该查看fork() 的文档,这里是:

    成功完成后,fork() 向子进程返回值 0 进程并将子进程的进程ID返回给父进程 过程。否则,返回值-1给父进程,否 创建子进程,并将全局变量 errno 设置为 indi- 找出错误。

    这对您来说意味着,这意味着您的父进程将在分叉时获取子进程的 PID。孩子知道是孩子,因为fork() 会返回 0 给孩子,所以类似于:

    如果((cpid = fork())) { // 这是父进程,子进程的pid // 在 `cpid` 变量中 }别的{ // 这是子进程,做你的孩子 // 在这里工作。 }

    当心你得到一个负数的机会(所以没有孩子),你应该检查一下。

    ps 的输出会因系统而异,但如果您查看整个树,您应该会看到一个示例(让您的进程休眠,这样您就有时间检查ps 的输出。)

    【讨论】:

    • 请再过一遍问题并告诉我问题的哪一部分不清楚...我不是在问“如何创建子进程”或“我将如何知道 pid孩子的“......我要问的是每次都按照相同的顺序吗?感谢您宝贵的时间
    猜你喜欢
    • 2017-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-01
    相关资源
    最近更新 更多