Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.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
linux读/写系统调用是否使用动态内存分配?_Linux_Malloc_Real Time_System Calls_Unix Socket_C - Fatal编程技术网

linux读/写系统调用是否使用动态内存分配?

linux读/写系统调用是否使用动态内存分配?,linux,malloc,real-time,system-calls,unix-socket,c,Linux,Malloc,Real Time,System Calls,Unix Socket,C,我想知道linux上的读写系统调用(与unix套接字一起使用)是否会进行动态内存分配 上下文是实时应用程序和确定性行为。否(我使用了grep-rn SYSCALL\u DEFINE.*write查找read/write),您可以自己查看源代码: SYSCALL_DEFINE3(read, unsigned int, fd, char __user *, buf, size_t, count) { struct fd f = fdget_pos(fd); ssize_t ret =

我想知道linux上的读写系统调用(与unix套接字一起使用)是否会进行动态内存分配

上下文是实时应用程序和确定性行为。

否(我使用了
grep-rn SYSCALL\u DEFINE.*write
查找
read
/
write
),您可以自己查看源代码:

SYSCALL_DEFINE3(read, unsigned int, fd, char __user *, buf, size_t, count)
{
    struct fd f = fdget_pos(fd);
    ssize_t ret = -EBADF;

    if (f.file) {
        loff_t pos = file_pos_read(f.file);
        ret = vfs_read(f.file, buf, count, &pos);
        if (ret >= 0)
            file_pos_write(f.file, pos);
        fdput_pos(f);
    }
    return ret;
}

SYSCALL_DEFINE3(write, unsigned int, fd, const char __user *, buf,
        size_t, count)
{
    struct fd f = fdget_pos(fd);
    ssize_t ret = -EBADF;

    if (f.file) {
        loff_t pos = file_pos_read(f.file);
        ret = vfs_write(f.file, buf, count, &pos);
        if (ret >= 0)
            file_pos_write(f.file, pos);
        fdput_pos(f);
    }

    return ret;
}
请注意,不同平台的系统调用定义可能不同:并非所有平台的系统调用定义都必须相同。事实上,许多平台只有少数体系结构支持系统调用

在您的情况下(即套接字),有一个预分配的每个套接字缓冲区,可能是通过动态分配的

在上面的链接中还有一些代码片段,可以在代码中提取这些值

如果您试图编写超过此缓冲区大小的大量消息,则需要将其拆分。通常,在向套接字写入时,您需要创建自己的
write()
-包装器,以确认是否写入了所有数据,或者是否需要使用一部分剩余数据再次调用
write()
,等等

就动态内存分配的性能而言,一旦创建了套接字,这一部分就完成了。吞吐量的更大瓶颈将是使用套接字处理I/O

/proc/sys/net/ipv4/tcp_rmem (for read)
/proc/sys/net/ipv4/tcp_wmem (for write)