1

元の書き込みのバッファを回復するにはどうすればよいですか?

size_t write(int fd, const void *buf, size_t count)
{
    static size_t (*write_func)(int, const void *, size_t) = NULL;

    /* get reference to original (libc provided) write */
    if (!write_func)
    {
        write_func = (size_t(*)(int, const void *, size_t))
                     dlsym(RTLD_NEXT, "write");
    }
    return  write_func(fd, buffer, sizeof (buffer));
}
4

2 に答える 2

1

拡張を実行する最も効率的な方法の 1 つは、元のバッファーで変更したいバイトを切り取り、デルタをスプライスすることです。これらは一緒に貼り付けられ、writevすべてを書き出すために使用します。

struct iovec v[3];
v[0].iov_base = buf;
v[0].iov_len = position_of_new_data;
v[1].iov_base = new_data;
v[1].iov_len = new_data_len;
v[2].iov_base = (const char *)buf + beginning_of_the_end;
v[2].iov_len = count - beginning_of_the_end;
return writev(fd, v, 3);

これは、I/O をブロックする場合にうまく機能するはずです。ノンブロッキング I/O の場合、write呼び出しが傍受されたという事実を隠すために、さらに多くの作業を行う必要があります。または、記述子をブロッキングに反転し、非ブロッキングに戻してから戻ることもできます。

于 2012-06-26T01:30:57.513 に答える
0

このような:

ssize_t write(int fd, const void *buf, size_t count)
{
    static size_t (*write_func)(int, const void *, size_t) = NULL;
    if (!write_func)
        write_func = (size_t(*)(int, const void *, size_t)) dlsym(RTLD_NEXT, "write");

    // buf is const so, in order to change it, we need to make a copy:
    char tmp[count+1];  // <- it might be safer to use malloc here
    memcpy(tmp,buf,count);

    // modify tmp here
    tmp[count]='a';

    return  write_func(fd, tmp, count+1);
}

それがあなたのやりたいことだったら、私に知らせてください。

于 2012-06-25T21:57:25.360 に答える