LinuxとWSLの差異: UNIX Domain Socket
LinuxはUNIX Domain Socketを何度もlisten(2)できるが、WSL (Windows Subsystem for Linux)は2回目のlisten(2)がエラーになる。backlogを変更しようとしてはまった。Rubyで検証した結果は次のとおり。
$ uname -a Linux gut 4.14.74-v7+ #1149 SMP Mon Oct 8 17:39:42 BST 2018 armv7l GNU/Linux $ irb -r socket irb(main):001:0> s = UNIXServer.new('/tmp/s') => #<UNIXServer:/tmp/s> irb(main):002:0> s.listen(10) => 0 irb(main):003:0>
WSL:
$ uname -a Linux DESKTOP-T2R3I3H 4.4.0-17763-Microsoft #253-Microsoft Mon Dec 31 17:49:00 PST 2018 x86_64 x86_64 x86_64 GNU/Linux $ irb -r socket irb(main):001:0> s = UNIXServer.new('/tmp/s') => #<UNIXServer:/tmp/s> irb(main):002:0> s.listen(10) Traceback (most recent call last): 5: from /usr/local/bin/irb:23:in `<main>' 4: from /usr/local/bin/irb:23:in `load' 3: from /usr/local/lib/ruby/gems/2.6.0/gems/irb-1.0.0/exe/irb:11:in `<top (required)>' 2: from (irb):2 1: from (irb):2:in `listen' Errno::EADDRINUSE (Address already in use - listen(2)) irb(main):003:0>
ちなみにTCP Socketは両方とも何度でもlisten(2)できるようだ。
$ uname -a Linux gut 4.14.74-v7+ #1149 SMP Mon Oct 8 17:39:42 BST 2018 armv7l GNU/Linux $ irb -r socket irb(main):001:0> s = TCPServer.new(0) => #<TCPServer:fd 7, AF_INET, 0.0.0.0, 39901> irb(main):002:0> s.listen(10) => 0 irb(main):003:0>
WSL:
$ uname -a Linux DESKTOP-T2R3I3H 4.4.0-17763-Microsoft #253-Microsoft Mon Dec 31 17:49:00 PST 2018 x86_64 x86_64 x86_64 GNU/Linux $ irb -r socket irb(main):001:0> s = TCPServer.new(0) => #<TCPServer:fd 7, AF_INET, 0.0.0.0, 56466> irb(main):002:0> s.listen(10) => 0 irb(main):003:0>