【问题标题】:fork() vs. CreateProcess(). System call vs. API?fork() 与 CreateProcess()。系统调用与 API?
【发布时间】:2015-10-22 02:31:39
【问题描述】:

假设 API 通常与它们调用的系统调用相似(并且在某些情况下相同)......

我们在用户应用程序中调用的 fork() 是调用实际系统调用 'fork()' 的“POSIX 中的 API”吗?还是我们直接调用 fork() 系统调用?

它与 Win32 API 中的 CreateProcess() 相比如何。

CreateProcess()是一个系统调用,它调用另一个系统调用NTCreateProcess()系统调用还是CreateProcess() Win32 API 中调用 NTCreateProcess() 系统调用的函数?

【问题讨论】:

  • 只是为了确保我理解:您的问题是关于哪些函数调用其他函数,还是只是关于我们给调用其他函数的函数起什么名称?
  • 前者。概括地说,我对“什么是系统调用,什么是 API”感到困惑?
  • API 代表“应用程序接口”。它基本上是一组供程序使用的类型、函数等。不过,“系统调用”并没有一个非常严格的定义——它几乎只是“系统提供的一些我可以调用的函数”。
  • 你为什么在乎? Q 的动机是什么?
  • 区分 API 和系统调用?当然这只是理论!

标签: api winapi fork posix system-calls


【解决方案1】:

我只能说 Linux 和 UNIX 变体,但我认为 Windows 是相似的。

我们在用户应用程序中调用的 fork() 是“POSIX 中的 API”吗? 它调用实​​际的系统调用'fork()'?还是我们直接 调用 fork() 系统调用?

在 Linux 中,fork(2) 是一个系统调用,但最近的 Linux 版本在大多数情况下不使用它。当您从 C 用户程序调用 fork(2) 时,您调用的是 glibc 包装器,而不是真正的系统调用 - 在最新版本中,glibc 包装器调用 clone(2) 并将必要的标志传递给它以指示新工艺。 clone(2) 是真正的系统调用(参见man 2 clone)。

但是,即使您直接在 C 程序中调用 clone(2),您也将调用 glibc 包装函数。大多数原始系统调用在 glibc 中都有一个等效的包装函数,因为原始系统调用调用依赖于架构。

一些联机帮助页包括包装器和原始系统调用的原型。例如,clone(2) 的手册页显示了这两种变体:

SYNOPSIS
/* Prototype for the glibc wrapper function */

#include <sched.h>

int clone(int (*fn)(void *), void *child_stack,
          int flags, void *arg, ...
          /* pid_t *ptid, struct user_desc *tls, pid_t *ctid */ );

/* Prototype for the raw system call */

long clone(unsigned long flags, void *child_stack,
            void *ptid, void *ctid,
            struct pt_regs *regs);

您通常可以从手册页中学到很多东西。 man 2 fork 在注释部分提到了我上面所说的:

注意事项

Linux下,fork()是使用copy-on-write实现的 页,所以它招致的唯一惩罚是时间和内存 需要复制父级的页表,并创建一个唯一的 孩子的任务结构。

从 2.3.3 版本开始,而不是调用内核的 fork() 系统 调用,作为 NPTL 的一部分提供的 glibc fork() 包装器 线程实现使用提供的标志调用 clone(2) 与传统系统调用的效果相同。 (对 fork() 的调用是 相当于调用 clone(2) 将标志指定为 SIGCHLD。)glibc 包装器调用任何 fork 处理程序 已使用 pthread_atfork(3) 建立。

(如果您想知道,NPTL 代表Native POSIX Threads Library

TL;DR 当您进行编程时,您永远不会真正直接调用系统调用。您调用 glibc 包装器来处理原始系统调用调用的细节。

【讨论】:

    【解决方案2】:

    正如 Jeffy Coffin 所指出的,API 代表应用程序接口,是描述一组函数、相关类型和其他语言接口和功能供应用程序使用的文档。 API 几乎可以是任何东西。例如,Stack Exchange 有一个web API,任何能够通过 Internet 发出 HTTP 请求的东西都可以使用它。

    此外,正如 Jerry Coffin 所说,“系统调用”一词的定义并不十分明确。它只是指实现操作服务的API函数。您可以争辩说 CreateProcess 和 NTCreateProcess 都不是系统调用。两者都是真正系统调用的 C 包装器,它是用汇编编写的位代码。另一方面,我认为它们都是系统调用。它们都提供对操作系统工具的访问,以创建新进程,而无需显着增加额外的功能。无论哪种方式,都无所谓。

    【讨论】:

      猜你喜欢
      • 2011-08-27
      • 1970-01-01
      • 1970-01-01
      • 2016-02-09
      • 2011-06-10
      • 1970-01-01
      • 2017-07-27
      • 1970-01-01
      • 2012-02-02
      相关资源
      最近更新 更多