Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c编译器如何识别系统调用?_C++_Sockets_Compiler Construction - Fatal编程技术网

C++ c编译器如何识别系统调用?

C++ c编译器如何识别系统调用?,c++,sockets,compiler-construction,C++,Sockets,Compiler Construction,假设我们想使用“socket”函数创建一个套接字。 编译器如何知道它必须调用相应函数的系统调用? 是否有任何内部表记录了属于特定库集的函数?通常的方法是: 平台库包含一个名为socket的函数,其中包含在平台上进行系统调用所需的实际代码。编译器读入一个头文件,该头文件告诉它该函数存在,链接器将编译后的代码连接到该函数,库对该函数的实现进行实际的系统调用。或者编译器不知道这类事情,而只是在标准C库中编译对该函数的调用,它由执行此系统调用的机器语言代码组成;或者编译器只知道socket()是一个系统

假设我们想使用“socket”函数创建一个套接字。 编译器如何知道它必须调用相应函数的系统调用?
是否有任何内部表记录了属于特定库集的函数?

通常的方法是:


平台库包含一个名为
socket
的函数,其中包含在平台上进行系统调用所需的实际代码。编译器读入一个头文件,该头文件告诉它该函数存在,链接器将编译后的代码连接到该函数,库对该函数的实现进行实际的系统调用。

或者编译器不知道这类事情,而只是在标准C库中编译对该函数的调用,它由执行此系统调用的机器语言代码组成;或者编译器只知道
socket()
是一个系统调用,以及如何进行调用。编译器只是知道。这很聪明,就像那样。好的,有道理。非常感谢。没有。系统调用通常通过标准c库提供的包装函数进行。然后编译器只调用
ssize\u t write(int,void const*,size\u t)
或任何其他类似的sycall包装器将调用任何其他函数,而不管其中的指令是否进行系统调用。是的,这是我最初的猜测,例如在c#中,您使用具有“dllimport”-属性的关键字“extern”。谢谢。@ChezBorz
dllimport
是一个窗口,实际上并不需要。UNIX工具链甚至Windows上的一些工具链都没有它。对已声明函数的调用只会在程序集中留下一个标记孔,链接器通过静态库(/对象文件)或通过链接dll/dso将其插入。同样,无论链接函数中包含什么,机制都是相同的。