【问题标题】:Does if(fork()) create a child process? [closed]if(fork()) 是否创建子进程? [关闭]
【发布时间】:2018-08-25 16:40:12
【问题描述】:

我正在复习操作系统考试,目前正在尝试理解这个过程问题:

int main() 
{
    int v=0;
    
    if(fork()) 
    {
        v++;
        
        if(!fork())
        {
            fork();
            v--; 
        }
    } 
}

所以问题要求

  1. 绘制一棵树,反映上述程序运行时创建的进程的父子层次结构。

  2. 创建了多少个整数变量 v 的单独副本?讨论树中每个进程在程序结束时 v 的值是多少。

我遇到的主要问题是

if(fork())

代码中的一行。通过查看其他堆栈溢出,我意识到

if(fork()) = if(fork() != 0)

但我仍然难以理解第一个 if 语句是否创建了子进程?因为这是第二个 if 语句的唯一方法:

(!fork())

可以执行吗?

这是我目前对这个问题的理解的程度。 screenshot of attempt

希望图表清晰易读!我真的很感激任何提示或指示。

【问题讨论】:

  • 注意:您可以将您的问题分解为两个完全独立的问题:(1) 调用fork() 是否会创建子进程? (2) if (some_function()) { ... } 是否调用 some_function()
  • How does fork() work?的可能重复

标签: c multithreading process operating-system


【解决方案1】:

请注意,if (fork()) /*etc*/ 完全

相同
pid_t newtmp = fork();
if (newtmp != 0) /*etc*/

其中newtmp 是您的程序中未出现的新(新)变量名(您可以使用x1x2 等......前提是您的程序中没有出现)和pid_t是某种整数类型(可能是int)。

一旦你用 explicitunique 名字重写你的代码给 fork 的结果,你会更好地理解它。

顺便说一句,代码味道很差。当您使用fork 时,您需要处理三种 情况:

  • fork 失败(例如,因为您的系统没有足够的内存,或者因为您超出了某些限制)并给出 -1

  • fork在孩子成功所以给0

  • fork 在父进程中成功,所以给出了子进程的 pid。

但是,当您编写if (fork()) 代码时,您会忘记 - 或处理不正确 - 第一种情况(失败)。它很少会发生。

仔细阅读(并多次)fork(2) 手册页。请注意,fork 很难理解。

关于限制,请注意setrlimit(2)(和ulimit bash 内置)。

【讨论】:

  • 我实际上并没有编写这段代码,它来自我试图理解的一个考试问题。
  • 像我所说的那样在心理上转换该代码将有助于您理解它。 fork 的任何出现都可以创建一个进程
【解决方案2】:

答案是

if (fork ())

可能或可能确定是否创建了子进程。

转到手册页:

http://man7.org/linux/man-pages/man2/fork.2.html

我们发现fork()返回三种类型的值:

  • -1 => fork() 失败
  • 0 => 在子进程中返回值
  • 正值 => 成功和子进程的 PID。

因此测试

if (fork ()) 

相同

if (fork () != 0)

无论是否创建子进程都可能成功。一个称职的书面问题会说

if (fork () > 0)

假设一切正常:

int main() 
{
    int v=0;

    if(fork())  // Creates a child process that does nothing.
    {
        v++;

       if(!fork()) // Creates a child process that creates a child process (that then does nothing but decrement v).
       {
           fork();
          v--; 
       }
   }  
}

【讨论】:

    猜你喜欢
    • 2014-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-18
    • 1970-01-01
    • 2012-10-28
    • 2011-10-02
    • 1970-01-01
    相关资源
    最近更新 更多