筑波大学 システム情報工学研究科
コンピュータサイエンス専攻, 電子・情報工学系
新城 靖
<yas@is.tsukuba.ac.jp>
このページは、次の URL にあります。
http://www.coins.tsukuba.ac.jp/~syspro/2011/2011-06-01/fdopen_sock.html
あるいは、次のページから手繰っていくこともできます。
http://www.coins.tsukuba.ac.jp/~syspro/2011/
http://www.coins.tsukuba.ac.jp/~yas/
130: int
131: fdopen_sock( int sock, FILE **inp, FILE **outp )
132: {
133: int sock2 ;
134: if( (sock2=dup(sock)) < 0 )
135: {
136: return( -1 );
137: }
138: if( (*inp = fdopen( sock2, "r" )) == NULL )
139: {
140: close( sock2 );
141: return( -1 );
142: }
143: if( (*outp = fdopen( sock, "w" )) == NULL )
144: {
145: fclose( *inp );
146: *inp = 0 ;
147: return( -1 );
148: }
149: setvbuf(*outp, (char *)NULL, _IONBF, 0);
150: return( 0 );
151: }
fdopen_sock() は、dup() してファイル記述子を増やし、fdopen() を呼んで
いる。fdopen() は、既に open() や pipe() 等で得られたファイル記述子から
高水準入出力ライブラリ
が使えるようにするためのものである。
setvbuf() では、バッファリングを行わせないようにしている。これにより、
たとえば fprintf() を行うと、即座にネットワークに送り出される。