あなたは、libevには限られた量のデータしか与えられていないと言いますが、ev_io
はそれ自身を処理し、そこにはファイル記述子がすべて有益であると結論づけています。まあ、普通、あなたはおそらく正しいでしょうが、あなたができることはきちんとしたトリックがあります。
libevでは構造体を自分で割り当ててからlibevで初期化するので、を割り当てすぎることはありませんスペースです。 libevは余分なスペースに触れないので、そこにあなた自身のものを置くことができます。成功!
これは実際にどのように機能しますか?あなたが最初のメンバーとしてev_io
を含む新しい構造体を作成し、それの後にあなたのデータのすべての残りの部分を入れて、次のように言う:あなたはuv_io
を割り当てるどこ
今
struct my_mutant_io {
ev_io handle;
int group_id;
};
が、代わりにmy_mutant_io
を割り当てます。あなたが好きしかし、そこにデータを入れて、あなたがlibuv関数にそれを渡す必要があります一度、だけではなく、handle
のアドレス取る:
struct my_mutant_io *mutant = malloc(sizeof(struct my_mutant_io));
if(!mutant) {
abort();
}
mutant->group_id = /* ... */;
ev_io_init(&mutant, some_callback, fd, EV_READ);
あなたはev_io
libevは与えてくれたが、それはどれも、ですそれは実際にはより大きな構造体の一部に過ぎません。次に、コールバックに移りましょう。あなたはev_io
を元に戻しますが、待ってください!ev_io
は構造体の最初のメンバーなので、そのアドレスは突然変異体のアドレスと同じです。 ev_io *
をstruct my_mutant_io *
にキャストして使用することができます。 (ただ、厳格なエイリアシングの神々を教えていない。)
このような構造体は、最も一般的にバトンと呼ばれています。
http://codereview.stackexchange.com/で使用している実際のコードを投稿するとよいでしょう。 –
なぜ誰かが私が求めているものとは異なる質問に投稿のタイトルを変更したのかよく分かりません。 –