【问题标题】:Amount of processes in fork() statements including programfork() 语句中的进程数量,包括程序
【发布时间】:2019-10-11 07:46:44
【问题描述】:

我正在学习 linux 中的分叉和进程,并且有一个关于初始父进程的问题。这个初始父进程是否被视为程序?

例如,我创建 2 个分叉的这段代码

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv, char **envp)
{
    printf("%d *\n", getpid());
    fork();
    printf("%d *\n", getpid());
    fork();
    printf("%d *\n", getpid());
    sleep(20);
    return EXIT_SUCCESS;
}

据我所知,会有一个初始父进程(我相信它是程序),然后会有初始分叉创建一个子进程。

剩下 2 个进程。然后另一个分支再创建 2 个子进程,总共 5 个进程,包括初始父进程。

根据这种理解,子进程的总数将是 3(2^2-1),而在初始父进程之外创建的进程总数将是 4。

我的想法对吗?

另外,什么会导致分叉失败?

【问题讨论】:

  • 您基本上是在说 2+2=5。首先你有 2 个(“这会留下 2 个进程”,其中包括上一段中的父进程),然后添加 2 个(“然后另一个叉子再创建 2 个子进程”),最后以某种方式得到 5 个(“对于总共 5 个进程,包括初始父进程")。
  • @SanderDeDycker 是的,因为我将程序与初始父进程分开处理,但初始父进程是程序。

标签: c linux process fork


【解决方案1】:

不完全是,每个fork() 调用都会创建一个额外的进程。在此示例中,您总共有 4 个进程,包括父进程。

编辑: 我建议您阅读手册以了解您学习和使用的方法,例如http://man7.org/linux/man-pages/man2/fork.2.html

你会在那里找到所有的解释,包括可能的失败原因。

【讨论】:

  • 程序是初始父进程吗?
  • 是的。fork()创建的进程是初始进程(“程序”)的副本。
  • @DarkApostle — 我建议您将“程序”视为磁盘上执行的文件。当程序运行时,有一个初始进程执行存储在磁盘上的程序的内存版本。当进程分叉时,有两个几乎相同的进程都运行相同的程序(但数据略有不同)。冲洗并重复。但是“程序”在磁盘上,而“进程”在内存中是相当准确的(换出的进程可能在磁盘上,除了磁盘现在是固态磁盘或 SSD,它是一种特殊的内存……)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-07
  • 2013-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-13
  • 1970-01-01
相关资源
最近更新 更多