けいじゅ@日本ラショナルソフトウェアです.

Socket#shutdownの動作がおかしい気がするのですがどうなんでしょう?

結果その1
dim% irb
irb0> require "socket.o"
true
irb0> s1, s2 = Socket.pair(Socket::AF_UNIX, Socket::SOCK_STREAM, 0)
[#<Socket:0x400d169c>, #<Socket:0x400d16b0>]
irb0> s1 << "abc\n"
#<Socket:0x400d169c>
irb0> s2.gets
"abc\n"
irb0> s1.shutdown 0
0
irb0> s1.print "abc\n"
nil
irb0> s2.gets
"abc\n"
irb0> s2.print "abc\n"
nil
irb0> s1.gets
"abc\n"
irb0> quit

結果その2-1
dim% irb
irb0> require "socket.o"
true
irb0> s1, s2 = Socket.pair(Socket::AF_UNIX, Socket::SOCK_STREAM, 0)
[#<Socket:0x400e8234>, #<Socket:0x400e8248>]
irb0> s1.shutdown 1
0
irb0> s1.print "abc\n"
nil
irb0> s2.gets
"abc\n"
irb0> s2.print "abc\n"
Broken pipe

結果その2-2
dim% irb
use readline module
irb0> require "socket.o"
true
irb0> s1, s2 = Socket.pair(Socket::AF_UNIX, Socket::SOCK_STREAM, 0)
[#<Socket:0x400d169c>, #<Socket:0x400d16b0>]
irb0> s1.shutdown 1
0
irb0> s1.gets
nil


結果その3
dim% irb
use readline module
irb0> require "socket.o"
true
irb0> s1, s2 = Socket.pair(Socket::AF_UNIX, Socket::SOCK_STREAM, 0)
[#<Socket:0x400d169c>, #<Socket:0x400d16b0>]
irb0> s1.shutdown 2
0
irb0> s2.print "abc\n"
nil
irb0> s1.gets
"abc\n"
irb0> s1 << "def\n"
Broken pipe

結果を見ると分かると思うのですが, s1.shutdown 0 では何も行なわれていま
せん. s1.shutdown 1 では(書き込みはできるが)読み込みができなくなってい
ます.  さらに, s1.shutdown 2 では(読み込みはできるが)書き込みができな
くなっています. 

そうであるべき動作と1づれています.

ソースを見ても分からなかったのですが...

static VALUE
bsock_shutdown(argc, argv, sock)
    int argc;
    VALUE *argv;
    VALUE sock;
{
    VALUE howto;
    int how;
    OpenFile *fptr;

    rb_scan_args(argc, argv, "01", &howto);
    if (howto == Qnil)
	how = 2;
    else {
	how = NUM2INT(howto);
===>	if (how < 0 && how > 2) how = 2;
    }
    GetOpenFile(sock, fptr);
    if (shutdown(fileno(fptr->f), how) == -1)
	rb_sys_fail(0);

    return INT2FIX(0);
}

===>のところは少なくとも間違っていると思います.

__
..............................石塚 圭樹@日本ラショナルソフトウェア...
----------------------------------->> e-mail: keiju / rational.com <<---