我已经阅读过“系统调用API用于用户空间访问,而系统API用于系统空间访问”。我对Linux操作系统的概念还很陌生,对系统API一无所知。有人能解释一下这两者之间的区别吗?
我已经阅读过“系统调用API用于用户空间访问,而系统API用于系统空间访问”。我对Linux操作系统的概念还很陌生,对系统API一无所知。有人能解释一下这两者之间的区别吗?
系统调用是通过软件中断向内核发出的显式请求。它是与操作系统交互的最低级别的东西。系统调用是当您调用内核时发生的。系统调用实际上旨在成为非常低级别的接口,可以说是针对您的程序无法自行完成的非常特定的功能。
而系统 API 用于调用系统调用。
正如Rahul Triparhi回答的那样,系统调用是从用户模式应用程序中看到的基本操作。使用strace(1)查找某个程序执行的系统调用。
系统调用在man
页面的第2节中有很好的文档(在Linux系统的终端上键入man man
)。因此,请阅读intro(2),然后阅读syscalls(2)。
严格来说,系统调用具有接口,特别是在ABI规范中有明确的规定,如x86-64 ABI,在尽可能低的机器级别上定义 - 以机器指令和寄存器等方式。第2部分中的函数是它们之上的微小C包装器。另请参见Linux Assembly HowTo
请阅读Advanced Linux Programming,其中很好地解释了其中许多内容。
顺便说一句,“系统API”是否有明确定义的含义,我不确定,即使我猜到了可能是什么。还可以参考this question的几个答案。
可能"系统API"是指由POSIX标准化的许多函数,实现在POSIX C库中,如GNU libc(但如果你真的想要的话,你可以在Linux上使用其他libc
,如MUSL libc)。我想到的函数有dlopen(动态加载插件)或getaddrinfo(3)(获取一些网络信息)等等... Linux实现(例如dlopen(3))提供了它的超集。
dlopen
实际上调用了mmap(2)系统调用,而getaddrinfo
可能使用系统调用连接到某个服务器 - 参见nsswitch.conf(5)等)。但是有些库函数可能不会执行任何系统调用,例如snprintf(3)或sqrt(3)或longjmp(3)...(它们只是进行内部计算,不需要任何其他内核服务)。