我真的不明白这个话题。例如,像
这样的函数printf()
strlen()
malloc()
哪个是系统调用,哪个不是?在给我一个函数时我怎么知道它?在Google上找不到任何内容。
答案 0 :(得分:7)
该系统依赖于此。有一个手册页syscalls
列出了Linux上的系统调用,例如:http://man7.org/linux/man-pages/man2/syscalls.2.html
此列表也依赖于版本:偶尔会在Linux内核中添加新的系统调用。
列表中的所有功能都不是系统调用。但是,他们的实现可能会使用系统调用:printf
使用write
系统调用,malloc
使用mmap
或mmap2
或brk
系统调用。相反,strlen
的典型实现不会使用系统调用。
答案 1 :(得分:1)
系统调用由系统类型或体系结构定义。大多数情况下,您可以预期系统调用会对您的程序或系统本身产生一些影响,例如打印到终端,进程之间的通信,动态内存分配以及许多甚至更多。
大多数常用的系统调用都包含在标准库中,如open
,send
,clone
等。要知道标准库中的哪些函数是您需要的系统调用检查手册页。此外,您可以使用strace工具检查程序调用的系统调用类型。一些更复杂的功能不等同于系统调用,但在下面使用它们 - 比如printf
和malloc
。
某些系统调用未包含在标准库中,只能显式调用:gettid
只能与syscall(SYS_gettid)
一起使用。
答案 2 :(得分:0)
您列出的这些功能都不是系统调用。这些都是C标准库中的所有功能,我不认为系统调用在其中。如果您想确定该功能是否是系统调用,我认为您必须在每个功能上查找手册页或类似的东西。
答案 3 :(得分:0)
这里有一些概念:
系统调用
标准库
系统调用将程序连接到特定的操作系统。这些调用执行一些标准功能,其实现依赖于操作系统。例如,打开文件:open
在所有操作系统上都可用,但其实现依赖于操作系统。
此外,某些操作系统提供其他操作系统不具备的特殊功能。调用此功能使用仅存在于该OS上的系统调用。使用此功能的程序是不可移植的。
标准库提供了许多程序所需的许多功能,例如使用sprintf
格式化字符串。这些函数通常也使用系统调用,例如printf
使用调用打印到stdout
。所有支持该语言的操作系统都可以使用标准库的功能。