【问题标题】:does cout << fork() acctully call fork()?cout << fork() 实际上调用 fork() 吗?
【发布时间】:2018-12-10 20:40:22
【问题描述】:

我的 fork 功能有问题。是

cout << fork();

真的调用 fork() 吗? 我正在尝试制作流程树,但仍然不知道如何管理 fork() 函数。 我写了简单的代码来解决它,但它什么也没解释。

int mainPID = getpid();
cout << "Main process: " << mainPID << endl << endl;

cout << fork() << endl;
cout << getpid() << endl;
cout << getppid() << endl;

它返回: 118, 119, 120 程序结束并在屏幕 0、118、1 上获取另一个值 cout

【问题讨论】:

  • fork() 完成时,您的程序有两个副本,所以当然它会运行两次。看到返回值0 的是新创建的孩子,看到(孩子的)PID 号的是父母。
  • 在我看来像 C++,而不是 bash。请正确标记您的问题。
  • 这是一个坏主意,有两个原因:它不会产生有用的信息,它会告诉两个不同的进程同时写入同一个资源。

标签: c++ linux fork pid


【解决方案1】:

fork() 返回两次:一次在原始父进程中,一次在子进程中。在父进程中,它返回子进程的 PID。在子进程中它返回0

在这两个进程中,返回值随后由cout &lt;&lt; 打印。所以你得到了多个输出。

如果父进程很快结束,它会在子进程调用getppid()之前退出。然后子进程将被init 进程继承,即PID 1。所以当孩子到达cout &lt;&lt; getppid() &lt;&lt; endl;时会打印1

【讨论】:

  • 子进程首先在当前的 Linux 内核上运行。这是因为fork() 的子级通常会快速调用exec(),从而丢弃其内存映射并使父级无需将其内存的每一页都进行写时复制。
  • @Davislor 进行格式化输出需要足够的时间,它可以在看到任何输出之前执行进程切换回父级。此外,如果有多个内核,它们可以同时在不同的 CPU 上运行。
  • 是的。在某些系统上,您可能会在 PID 的数字中间得到一个 0。
  • @Davislor 也许有可能,但不太可能。 stdio 到终端的输出是行缓冲的,因此它不会在单独的调用中写入数字。
  • @Bamar 取决于一堆实现细节!
【解决方案2】:

0 从带有cout &lt;&lt; fork() &lt;&lt; endl; 的子进程返回值

118 来自子 pid cout &lt;&lt; getpid() &lt;&lt; endl;

1 from parent id cout &lt;&lt; getppid() &lt;&lt; endl; 因为真正的父进程已经退出,所以您的子进程已被放弃,因此它接受 pid = 1 的 init 作为新父进程。

我建议更改一些代码以清楚地拆分子进程和父进程,像这样

if ((pid = fork()) == -1) return -1;

if (pid == 0) 
    {
    //source for child process
    }else{
    //source for parent process
    }

【讨论】:

    猜你喜欢
    • 2019-04-26
    • 2019-08-25
    • 1970-01-01
    • 2016-01-04
    • 2014-02-12
    • 1970-01-01
    • 2013-10-20
    • 2015-03-30
    • 2011-11-30
    相关资源
    最近更新 更多