如何知道C中的函数是否是系统调用

时间:2016-03-18 10:01:47

标签: c call system

我真的不明白这个话题。例如,像

这样的函数
  • printf()
  • strlen()
  • malloc()

哪个是系统调用,哪个不是?在给我一个函数时我怎么知道它?在Google上找不到任何内容。

4 个答案:

答案 0 :(得分:7)

该系统依赖于此。有一个手册页syscalls列出了Linux上的系统调用,例如:http://man7.org/linux/man-pages/man2/syscalls.2.html

此列表也依赖于版本:偶尔会在Linux内核中添加新的系统调用。

列表中的所有功能都不是系统调用。但是,他们的实现可能会使用系统调用:printf使用write系统调用,malloc使用mmapmmap2brk系统调用。相反,strlen的典型实现不会使用系统调用。

答案 1 :(得分:1)

系统调用由系统类型或体系结构定义。大多数情况下,您可以预期系统调用会对您的程序或系统本身产生一些影响,例如打印到终端,进程之间的通信,动态内存分配以及许多甚至更多。

大多数常用的系统调用都包含在标准库中,如opensendclone等。要知道标准库中的哪些函数是您需要的系统调用检查手册页。此外,您可以使用strace工具检查程序调用的系统调用类型。一些更复杂的功能不等同于系统调用,但在下面使用它们 - 比如printfmalloc

某些系统调用未包含在标准库中,只能显式调用:gettid只能与syscall(SYS_gettid)一起使用。

答案 2 :(得分:0)

您列出的这些功能都不是系统调用。这些都是C标准库中的所有功能,我不认为系统调用在其中。如果您想确定该功能是否是系统调用,我认为您必须在每个功能上查找手册页或类似的东西。

答案 3 :(得分:0)

这里有一些概念:

  • 系统调用

  • 标准库

系统调用将程序连接到特定的操作系统。这些调用执行一些标准功能,其实现依赖于操作系统。例如,打开文件:open在所有操作系统上都可用,但其实现依赖于操作系统。

此外,某些操作系统提供其他操作系统不具备的特殊功能。调用此功能使用仅存在于该OS上的系统调用。使用此功能的程序是不可移植的。

标准库提供了许多程序所需的许多功能,例如使用sprintf格式化字符串。这些函数通常也使用系统调用,例如printf使用调用打印到stdout。所有支持该语言的操作系统都可以使用标准库的功能。