if(fork())是否创建子进程?

时间:2018-03-16 14:54:32

标签: c multithreading process operating-system

我正在修改操作系统考试,目前正试图理解这个过程问题:

int main() 
{
    int v=0;

    if(fork()) 
    {
        v++;

        if(!fork())
        {
            fork();
            v--; 
        }
    } 
}

所以问题要求

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

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

  4.   

我遇到的主要问题是

if(fork())
代码中的

行。通过查看其他堆栈溢出,我意识到了

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

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

(!fork())

可以执行吗?

这是我对目前对这个问题的理解有多远。 screenshot of attempt enter image description here

希望图表清晰可辨!对于任何提示或指示,我都非常感激。

2 个答案:

答案 0 :(得分:1)

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

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

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

使用显式唯一名称重写您的代码后,fork会给您更好的理解。

BTW,代码味道不佳。当您使用fork时,您需要处理三个案例:

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

  • fork在孩子中成功,所以给出0

  • fork在父级中成功,因此给出了孩子的pid。

但是当你编码if (fork())时,你会忘记 - 或者错误地处理 - 第一种情况(失败)。它很少发生。

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

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

答案 1 :(得分:0)

答案是

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--; 
       }
   }  
}