系统调用与 C/C++ 系统调用

System calls vs C/C++ system calls

我目前正在编写 C 程序,其中一个限制是我无法使用 system 调用外部程序。相反,我需要使用 C/C++ 库中的系统调用在语言的惯用语中工作。我在理解 "system" 调用和 "C/C++ system" 调用之间的区别时遇到了一些麻烦。

system 是否仅依赖于平台,而 "C system" 调用构建在 system 之上并根据所使用的平台自动更改其执行?

希望我的问题很清楚。提前致谢!

术语 "system call" 用于操作系统本机功能,例如 pipeforkwrite(在 POSIX 平台上,例如 Linux),与函数system无关。然后你就有了标准库,它在 C(或 C++)规范中指定,通常建立在操作系统本机 "system calls".

之上

阅读例如this Wikipedia "system call" article, or this about standard libraries 获取更多信息。

此外,没有操作系统调用,或者 C(或 C++)标准库函数实际调用 system function, in fact the system function is implemented using lower-level system calls (like fork and wait on Linux). The system 函数是 C 和 C++ 中标准库的一部分。

system 函数本身基本上会产生一个 shell 进程并启动该程序,就好像用户刚刚从命令行自己键入它一样。

"System calls" 在另一种意义上是运行时库调用操作系统来执行程序代码无法自行执行的操作。例如:打开一个文件,启动另一个进程,以及任何类型的 I/O 操作。在 Linux,这些系统调用中的大多数都公开为 C 函数 API,您的程序可以调用这些 API 来执行这些操作(例如打开、读取等)。所有 Linux 系统调用都列在此处的手册页上:http://man7.org/linux/man-pages/man2/syscalls.2.html

基于

Linux 的操作系统以两种方式公开功能:

  • 命令行工具通过 shell
  • 通过C语言进行系统调用

例如创建目录:

使用shell,使用mkdir命令,见http://linux.die.net/man/1/mkdirsystem C函数调用一个shell来调用这样的命令:

system("mkdir foo");

对应的系统调用也叫mkdir,现改为http://linux.die.net/man/2/mkdir

在C中直接使用是这样的:

mkdir("foo", 0755);

使用后一个调用的好处是更容易检查错误情况,并且不会发生分叉以将工作委托给子进程,这使得该解决方案在内存使用方面更快更轻,等等东西。