相关疑难解决方法(0)

带/ dev/zero的mmap

假设我使用/ dev/zero为mmap分配一个大内存(40MB),如下所示.

fd = open("/dev/zero", O_RDWR); 
a = mmap (0, 4096e4, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_FILE, fd, 0);
Run Code Online (Sandbox Code Playgroud)

我的理解是,当页面被带入物理内存时,内核会将内存初始化为零(我认为现代Linux内核使用Demand分页).因此,例如,当第一页被触摸并因此被带入物理存储器时,内核将其所有4096字节初始化为零,然后当触摸第二页时,它执行相同的操作,依此类推.

我的理解是否正确?

c linux gcc memory-management mmap

14
推荐指数
1
解决办法
7847
查看次数

从TCP套接字拼接时,Linux的splice(2)是否有效?

我一直在编写一个有趣的程序,可以在Linux上用C语言通过TCP传输文件.程序从套接字读取文件并将其写入文件(反之亦然).我最初使用读/写和程序正常工作,但后来我学习了拼接,并想尝试一下.

我用splice编写的代码在从stdin(重定向文件)读取并写入TCP套接字时非常有效,但在从套接字读取并写入stdout时,会立即将splice设置errno设置为EINVAL.手册页指出当两个描述符都不是管道(不是这种情况)时,EINVAL被设置,为无法搜索的流传递偏移量(没有传递偏移量),或文件系统不支持拼接,这导致我我的问题:这是否意味着TCP可以拼接管道,而不是

我包括下面的代码(减去错误处理代码),希望我做错了.它主要基于维基百科的拼接示例.

static void splice_all(int from, int to, long long bytes)
{
    long long bytes_remaining;
    long result;

    bytes_remaining = bytes;
    while (bytes_remaining > 0) {
        result = splice(
            from, NULL,
            to, NULL,
            bytes_remaining,
            SPLICE_F_MOVE | SPLICE_F_MORE
        );

        if (result == -1)
            die("splice_all: splice");

        bytes_remaining -= result;
    }
}

static void transfer(int from, int to, long long bytes)
{
    int result;
    int pipes[2];

    result = pipe(pipes);

    if (result == -1)
        die("transfer: pipe"); …
Run Code Online (Sandbox Code Playgroud)

c linux pipe

10
推荐指数
1
解决办法
6143
查看次数

在偏移处从文件描述符读/写

我一直在使用read(2)write(2)函数来读取和写入给定文件描述符的文件.

是否有这样的函数允许您将偏移量放入文件中进行读/写?

c file-descriptor

10
推荐指数
4
解决办法
3万
查看次数

标签 统计

c ×3

linux ×2

file-descriptor ×1

gcc ×1

memory-management ×1

mmap ×1

pipe ×1