2

bind()関数はパラメーターのconst struct sockaddr *addr1 つとして取得します。呼び出しsockaddrた直後に削除される一時構造体を渡すことはできますか?bind()

void bindMe(int socket) {
    struct sockaddr_in addr = {...};
    bind(socket, (struct sockaddr_in*)&addr, sizeof(sockaddr_in));
}
// addr is no more exist after function calling, 
// but I still want to work with the socket.

また、POSIX には構造体へのポインタを取る関数がたくさんあります。関数呼び出し後に構造体を解放できるかどうかを判断するにはどうすればよいですか?

4

1 に答える 1

6

はい、できます。 bindは同期システム コールであるため、返されると、カーネルはすべてのパラメーターを使用して完了します。

ソケットが非ブロッキングであり、バインドが非同期で行われていることを示すためにbind戻った場合でも、構造体を解放しても安全です。EINPROGRESS操作が非同期的に完了する間、カーネルは構造体を内部的にコピーします。

関数呼び出し後に構造体を解放できるかどうかを判断するにはどうすればよいですか?

ドキュメントを読んでください。ほとんどの POSIX 関数は同期的であり、関数が戻った後にパラメーターの割り当てを安全に解除できますが、常にそうであるとは限りません。よくわからない場合は、ドキュメントをお読みください。また、明らかに、プログラムに複数のスレッドがある場合、API 呼び出しの進行中に別のスレッドからのデータを同時に変更するべきではありません。

于 2012-10-01T20:52:32.897 に答える