-1

私は、libuv というライブラリの開発者によって提供されたこのソース コードを見てきました。一部のサンプル コードでは、関数を別の関数のパラメーターとして渡しますが、必要なパラメーターはどれも渡されません。パラメータはどのように入力されていますか? 私が見ている関数は uv_fs_open です。

ソースへのリンクは次のとおりです (関数コードについては、1000 行目あたりを参照してください): https://github.com/libuv/libuv/blob/202195c2f45ced200ccf880ff4502eee94f11ab5/src/unix/fs.c
サンプル コードは次のとおりです。

int main() {
    loop = uv_default_loop();

    int r = uv_fs_open(loop, &open_req, path, O_RDONLY, S_IRUSR, open_cb);

    if (r) {
         fprintf(stderr, "Error at opening file: %s.\n", 
                uv_strerror(uv_last_error(loop)));
    }  

    uv_run(loop, UV_RUN_DEFAULT);

    return 0;
}

void open_cb(uv_fs_t* req) {
    int result = req->result;

    if (result == -1) {
        fprintf(stderr, "Error at opening file: %s.\n", 
                uv_strerror(uv_last_error(loop)));
    }  

    uv_fs_req_cleanup(req);
    uv_fs_read(loop, &read_req, result, buf, sizeof(buf), -1, read_cb);
}
4

1 に答える 1

2

libuv は、その非同期関数にコールバック バトンと呼ばれるパターンを使用します。論理的根拠は非常に単純です。非同期で何かをしたいと仮定しましょう。したがって、コールバック関数を関数ポインターとして渡し、完了時に呼び出すようにします。libuv の関数は非同期でジョブを実行し、完了時に指定した関数を呼び出します。

ただし、これらの関数を呼び出す場所が複数ある場合は、コールバックが呼び出されたら、コールバックが呼び出され要求を特定する必要があります。それがバトンオブジェクトの目的です。サンプル コードの場合、それはopen_req(タイプの) 変数ですuv_fs_t

libuv のファイル システム操作の詳細については、こちらを参照してください。

于 2015-05-27T19:08:36.803 に答える