.\" Copyright (c) 1983, 1990, 1991, 1993 .\" The Regents of the University of California. All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions .\" are met: .\" 1. Redistributions of source code must retain the above copyright .\" notice, this list of conditions and the following disclaimer. .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. .\" 3. All advertising materials mentioning features or use of this software .\" must display the following acknowledgement: .\" This product includes software developed by the University of .\" California, Berkeley and its contributors. .\" 4. Neither the name of the University nor the names of its contributors .\" may be used to endorse or promote products derived from this software .\" without specific prior written permission. .\" .\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE .\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" .\" @(#)accept.2 8.2 (Berkeley) 12/11/93 .\" %FreeBSD: src/lib/libc/sys/accept.2,v 1.10.2.8 2001/08/17 15:42:43 ru Exp % .\" .\" $FreeBSD: doc/ja_JP.eucJP/man/man2/accept.2,v 1.5 2001/07/29 05:15:12 horikawa Exp $ .Dd December 11, 1993 .Dt ACCEPT 2 .Os .Sh 名称 .Nm accept .Nd ソケット上の接続を受け入れる .Sh ライブラリ .Lb libc .Sh 書式 .Fd #include .Fd #include .Ft int .Fn accept "int s" "struct sockaddr *addr" "socklen_t *addrlen" .Sh 解説 引数 .Fa s は .Xr socket 2 で作成され、 .Xr bind 2 でアドレスにバインドされ、 .Xr listen 2 も済ませて接続を待ち受けているソケットです。 .Fn accept 呼び出しは、待ち行列上の最初の接続要求を取り出し、 .Fa s と同じプロパティの新しいソケットを作成し、 ソケットのための新しいファイル記述子を割り当てます。 接続要求が待ち行列上に存在せず、 しかもソケットが非ブロッキングとマークされていない場合、 .Fn accept は接続要求があるまで呼び出し側をブロックします。 ソケットが非ブロッキングとマークされており、 しかも待ち行列に接続要求が存在しない場合、 .Fn accept は後述のようにエラーを返します。 接続が成立したソケットは、それ以上の接続を受け入れるために 使用できません。 オリジナルのソケット .Fa s は開いたままです。 .Pp 引数 .Fa addr は結果パラメータで、 通信レイヤに既知の接続エンティティのアドレスで埋められます。 .Fa addr パラメータの正確な形式は通信が行なわれるドメインで決まります。 .Fa addrlen は、「値 - 結果」パラメータです。 これは最初は .Fa addr が指す空間のサイズを含んでいなければなりません。 戻り時には、返されるアドレスの実際の長さ (バイト単位) を含むことになります。 この呼び出しは、コネクションをベースとしたソケットタイプ、 現在では .Dv SOCK_STREAM とともに使用されます。 .Pp 読取りでソケットを .Xr select 2 することによって、 .Fn accept するソケットを選ぶことができます。 .Pp .Tn ISO または .Tn DATAKIT のような明瞭な確認が必要な特定のプロトコルでは、 .Fn accept は単に次の接続要求を待ち行列から除くだけで、 確認は行わないと考えられます。確認は、新しいファイル記述子についての 通常の読取りまたは書込みによって行うことができ、 拒絶は新しいソケットを閉じる事によって実現できます。 .Pp .Fa msg_iovlen を 0 に、 .Fa msg_controllen を 0 でない値に設定して .Xr recvmsg 2 を発行することによって、または .Xr getsockopt 2 を発行することによって、確認なしにユーザ接続要求データを得ることができます。 同じように、制御情報だけを指定して .Xr sendmsg 2 を発行することによって、または .Xr setsockopt 2 を発行することによって、ユーザ接続拒絶情報を提供できます。 .Sh 実装に関する注 非スレッドライブラリで .Fn accept は .Va accept システムコールとして実装されます。 .Pp スレッドライブラリでは、 .Va accept システムコールは .Fn _thread_sys_accept にアセンブルされ、 .Fn accept は、読取りと書込み用に .Fa s をロックしてから、 .Fn _thread_sys_accept を呼び出す関数として実装されます。 .Fn _thread_sys_accept への呼び出しがブロックする場合はコンテキストスイッチが 実行されます。戻る前に .Fn accept は .Fa s をアンロックします。 .Sh 戻り値 システムコールはエラーがあった場合 \-1 を返します。 処理が正常に完了した場合、受け付けたソケットの 記述子である非負整数を返します。 .Sh エラー .Fn accept は次の場合に失敗します: .Bl -tag -width Er .It Bq Er EBADF 記述子が有効ではありません。 .It Bq Er EINTR .Fn accept 操作が割り込まれました。 .It Bq Er EMFILE プロセスの記述子テーブルが満杯です。 .It Bq Er ENFILE システムファイルテーブルが満杯です。 .It Bq Er ENOTSOCK 記述子がファイルを参照しておりソケットではありません。 .It Bq Er EINVAL .Xr listen 2 がソケット記述子に対して呼び出されていません。 .It Bq Er EFAULT .Fa addr パラメータがユーザアドレス空間の書込み可能な部分にありません。 .It Bq Er EWOULDBLOCK ソケットが非ブロッキングとマークされ、さらに 受け付けるべき接続要求が存在しません。 .It Bq Er ECONNABORTED 接続要求が到着しましたが、待ち行列で待機している 間に閉じてしまいました。 .El .Sh 関連項目 .Xr bind 2 , .Xr connect 2 , .Xr getpeername 2 , .Xr listen 2 , .Xr select 2 , .Xr socket 2 .Sh 歴史 .Fn accept 関数は .Bx 4.2 で登場しました。