【问题标题】:Relation between sequence of call of fork() and exec()fork() 和 exec() 调用顺序的关系
【发布时间】:2017-03-30 01:22:01
【问题描述】:

我明白了 fork() 和 exec() 系统调用的区别

一个程序可能是多线程的——即,可能包含多个线程,例如 T1、T2 和 T3。现在,如果程序的特定线程——比如 T2——执行 fork(),将创建一个新的重复(除了具有不同的 PID、PC、堆栈)进程,有两种可能性:

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

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

所以对于上述场景有两个版本的 fork()。

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

我说的对吗?

问题

如果调用顺序是这样的

  • fork() 后面紧跟着 exec()

  • exec() 后面紧跟着 fork()

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

【问题讨论】:

  • exec() -> fork()其实是不可能的,因为exec()只有在失败的时候才会返回。

标签: multithreading unix fork exec


【解决方案1】:

我说的对吗?

不是真的。 fork 概念是一种 UNIX 主义。如果你调用 fork() 你应该得到一个几乎与原始进程完全相同的副本。唯一不同的是,父进程fork的返回值是子进程的进程思想,而子进程fork的turn值为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()

例如,考虑一个命令行外壳。你输入如下内容:

$ ./someapplication param1 param2

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

是的,这令人困惑。在大多数操作系统中,您在创建子进程时指定可执行文件。这种分叉系统在 PDP 计算机时代是有意义的,从 UNIX 系统的局限性来看,它对于某些网络编程应用程序也是有意义的。

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

UNIX 没有那么复杂。所有 I/O 都阻塞了。在 RSX 中,通常会有一个进程控制多个设备,而在 UNIX 中,每个设备只有一个进程(请记住,这是在线程时代之前——尽管阻塞 I/O 调用对于太监线程仍然存在问题)。 fork 模型适合 UNIX 的做事方式,并提供了一种创建进程的简单方法。在 RSX 中,进程创建的开销要大得多。

【讨论】:

    猜你喜欢
    • 2011-10-03
    • 2015-12-01
    • 1970-01-01
    • 2012-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 2018-06-10
    相关资源
    最近更新 更多