fork()和exec()的调用顺序之间的关系

时间:2017-03-30 01:22:01

标签: multithreading unix fork exec

我得到了fork()和exec()系统调用之间的区别

程序可以是多线程的 - 即,可以包含多个线程,比如T1,T2和T3。现在,如果某个程序的特定线程(比如T2)执行fork(),则会创建一个具有两个可能性的新副本(具有不同的PID,PC,堆栈除外):

  1. 已创建的进程将包含所有线程T1,T2,T3。

  2. 已创建的进程将仅包含执行fork()的线程,即T2。这是一个单线程进程

  3. 因此上面的场景有两个版本的fork()。

    • 第1点表示exec()
    • 第2点表示fork()

    我说错了吗?

    问题

    如果通话顺序如

    • fork()后面紧跟exec()

    • exec()后面紧跟fork()

    有谁可以提供以上两种情况的实际例子?

1 个答案:

答案 0 :(得分:0)

  

我说错了吗?

不是真的。 fork概念是UNIX-ism。如果你调用fork(),你应该得到原始进程的几乎完全相同的副本。唯一不同的是父进程中fork的返回值是子进程的进程概念,而子进程中fork的转向值为0。

if (fork () == 0)
{
   // In the child process
   // Usually call exec here.
}
else
{
   //  In the parent process
} 

在UNIX变体上,您应该获得子项中父项的所有线程的副本。其他系统可能有不同的行为。

对fork()的调用通常紧接着调用exec(或其变体之一)来加载不同的程序。很少有任何用途来简单地分叉父程序的副本并使其保持运行(例外:这在处理网络连接的服务器应用程序中很常见)。

  

有谁可以提供以上两种情况的实际例子?

首先,通常不会发生此序列:

  

exec()后面紧跟fork()

这是fork的正常用法:

  

fork()后面紧跟exec()

例如,考虑命令行shell。你键入这样的东西:

$ ./someapplication param1 param2

为了启动someapplication,shell需要创建一个新进程。它通过调用fork()来实现。这只是创建一个shell的副本(不是很有用)。 shell的子进程副本调用exec来运行someapplication

是的,这很令人困惑。在大多数操作系统中,您可以在创建子进程时指定可执行文件。这个fork系统在PDP计算机时代是有意义的,当在UNIX系统的限制环境中查看时,它对于某些网络编程应用程序是有意义的。

例如,在PDP上运行的RSX操作系统下,存在软件中断的规定。单个进程可以处理多个网络连接和设备。您可以将I / O请求排队到设备(非阻塞),然后在I / O完成时接收软件中断。因此,单个进程可能会在多个设备上挂起I / O请求。

UNIX不太复杂。所有I / O都阻塞了。在RSX中,你通常会有一个进程控制多个设备,在UNIX中你每个设备都有一个进程(请记住这是在线程的日子之前 - 虽然阻塞I / O调用仍然存在问题,因为太监线程)。 fork模型适合UNIX的处理方式,并提供了一种创建进程的简单方法。在RSX中,创建流程的开销要大得多。