C++ c编译器如何识别系统调用?
假设我们想使用“socket”函数创建一个套接字。 编译器如何知道它必须调用相应函数的系统调用?C++ c编译器如何识别系统调用?,c++,sockets,compiler-construction,C++,Sockets,Compiler Construction,假设我们想使用“socket”函数创建一个套接字。 编译器如何知道它必须调用相应函数的系统调用? 是否有任何内部表记录了属于特定库集的函数?通常的方法是: 平台库包含一个名为socket的函数,其中包含在平台上进行系统调用所需的实际代码。编译器读入一个头文件,该头文件告诉它该函数存在,链接器将编译后的代码连接到该函数,库对该函数的实现进行实际的系统调用。或者编译器不知道这类事情,而只是在标准C库中编译对该函数的调用,它由执行此系统调用的机器语言代码组成;或者编译器只知道socket()是一个系统
是否有任何内部表记录了属于特定库集的函数?通常的方法是:
平台库包含一个名为
socket
的函数,其中包含在平台上进行系统调用所需的实际代码。编译器读入一个头文件,该头文件告诉它该函数存在,链接器将编译后的代码连接到该函数,库对该函数的实现进行实际的系统调用。或者编译器不知道这类事情,而只是在标准C库中编译对该函数的调用,它由执行此系统调用的机器语言代码组成;或者编译器只知道socket()
是一个系统调用,以及如何进行调用。编译器只是知道。这很聪明,就像那样。好的,有道理。非常感谢。没有。系统调用通常通过标准c库提供的包装函数进行。然后编译器只调用ssize\u t write(int,void const*,size\u t)
或任何其他类似的sycall包装器将调用任何其他函数,而不管其中的指令是否进行系统调用。是的,这是我最初的猜测,例如在c#中,您使用具有“dllimport”-属性的关键字“extern”。谢谢。@ChezBorzdllimport
是一个窗口,实际上并不需要。UNIX工具链甚至Windows上的一些工具链都没有它。对已声明函数的调用只会在程序集中留下一个标记孔,链接器通过静态库(/对象文件)或通过链接dll/dso将其插入。同样,无论链接函数中包含什么,机制都是相同的。