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
Sockets sys_sendto Linux系统调用实现_Sockets_Linux Kernel_Sendto - Fatal编程技术网

Sockets sys_sendto Linux系统调用实现

Sockets sys_sendto Linux系统调用实现,sockets,linux-kernel,sendto,Sockets,Linux Kernel,Sendto,我试图探索“sendto”套接字函数的实现。我试图在Linux中找到一个实现 在Linux中,sendto函数对应于“sys_sendto”系统调用。当我试图遵循它时,我只找到了一个定义,即: asmlong sys\u sendto(void)属性((弱,别名(“sys\u ni\u syscall”)) 也就是说,sys_sendto只是sys_ni_syscall的别名,它只返回一个值。就我而言,这没有意义。在哪里可以找到sys_snedto实现?它是由一些汇编代码实现的吗?您可以找到se

我试图探索“sendto”套接字函数的实现。我试图在Linux中找到一个实现

在Linux中,sendto函数对应于“sys_sendto”系统调用。当我试图遵循它时,我只找到了一个定义,即:

asmlong sys\u sendto(void)属性((弱,别名(“sys\u ni\u syscall”))


也就是说,sys_sendto只是sys_ni_syscall的别名,它只返回一个值。就我而言,这没有意义。在哪里可以找到sys_snedto实现?它是由一些汇编代码实现的吗?

您可以找到
sendto
的Linux实现。如您所见,它是es在功能更强大的
sendmsg
周围安装一个包装器


看起来您看到的是系统调用的声明(原型),而不是实现。

它位于
net/socket.c

SYSCALL\u DEFINE6
宏是用于定义包含六个参数的系统调用的宏。它是在
include/linux/syscalls.h
中定义的。它相当复杂,所以让我们先看看无参数版本中会发生什么:

#define SYSCALL_DEFINE0(sname)                                  \
        SYSCALL_METADATA(_##sname, 0);                          \
        asmlinkage long sys_##sname(void)
kernel/sys.c
中定义的系统调用如
getuid()
,其编码如下:

SYSCALL_DEFINE0(getuid)
{
    /* Only we change this so SMP safe */
    return from_kuid_munged(current_user_ns(), current_uid());
}
宏扩展到

SYSCALL_METADATA(_##sname, 0);
asmlinkage long sys_getuid(void)
{
    /* Only we change this so SMP safe */
    return from_kuid_munged(current_user_ns(), current_uid());
}
这是对函数的简单定义
sys\u getuid


元数据可以选择性地编译到内核中进行跟踪。有关详细信息,请参阅
syscalls.h
中的源代码。

我已经看过此页面。代码显示另一个函数“sock\u sendmsg”正在做这项工作。但是,当我尝试实现它时,我没有得到任何具体的信息。我想要的是了解sendto函数的底部。换句话说,缓冲区是如何传输的,以及参数(地址、端口等)是如何传输的是的,
sock\u sendmsg
是在同一个文件中定义的。看看它是怎么做的。你会看到它调用
\uuuusock\u sendmsg
,然后调用
\uusock\u sendmsg\u nosec
。你会看到调用是根据所涉及的套接字类型进行调度的。
SYSCALL_METADATA(_##sname, 0);
asmlinkage long sys_getuid(void)
{
    /* Only we change this so SMP safe */
    return from_kuid_munged(current_user_ns(), current_uid());
}