我正在编写一个C程序,其中一个限制是我无法使用system
调用外部程序。相反,我需要使用C / C ++库中的系统调用在语言的习语中工作。我在理解“系统”调用和“C / C ++系统”调用之间的区别时遇到了一些麻烦。
system
是否仅依赖于平台,而“C系统”调用是system
的ontop,并根据所使用的平台自动更改其执行?
希望我的问题很明确。提前谢谢!
答案 0 :(得分:6)
基于Linux的操作系统以两种方式公开功能:
例如,要创建目录:
使用shell,使用mkdir
命令,请参阅http://linux.die.net/man/1/mkdir。
system
C函数调用shell来调用这样的命令:
system("mkdir foo");
相应的系统调用也称为mkdir
,现在请改为http://linux.die.net/man/2/mkdir。
它直接在C中使用:
mkdir("foo", 0755);
使用后一种调用的好处是可以更容易地检查错误情况,并且不会将工作委托给子进程进行分叉,这使得此解决方案在内存使用方面更快,更轻松等等。
答案 1 :(得分:3)
术语"系统调用"适用于操作系统本机函数,如pipe
或fork
或write
(在Linux等POSIX平台上),它与函数system
无关。然后你就拥有了在C(或C ++)规范中指定的标准库,并且通常建立在操作系统本机"系统调用"。
阅读,例如this Wikipedia "system call" article或this about standard libraries了解详情。
此外,没有操作系统调用或C(或C ++)标准库函数执行调用system
函数,事实上system
函数是使用较低级系统调用实现的< / em>(如Linux上的fork
和wait
)。 system
函数是C和C ++中标准库的一部分。
答案 2 :(得分:2)
system函数本身基本上生成一个shell进程并启动该程序,就像用户刚从命令行中输入它一样。
&#34;系统调用&#34;在另一个意义上,运行时库用来调用操作系统来执行程序代码无法对其执行的操作。例如:打开文件,启动另一个进程以及任何类型的I / O操作。在Linux上,大多数这些系统调用都公开为程序可以调用的C函数API执行这些操作(例如打开,读取等)。所有Linux系统调用都列在手册页上:http://man7.org/linux/man-pages/man2/syscalls.2.html