メモ
スレッドIDを取得するシステムコール
スレッドIDを取得するシステムコールがある(gettid)。
で、これはシステムコール番号186(64bitの場合)。
Man page of GETTID https://linuxjm.osdn.jp/html/LDP_man-pages/man2/gettid.2.html
Syscall Number for x86-64 linux (A) https://www.mztn.org/lxasm64/x86_x64_table.html
システムコールを実行するRubyのメソッド
で、Rubyにはシステムコールを実行するメソッドがある( Kernel#syscall
)ので、これで上記のシステムコール番号を指定する。
Kernel.#syscall (Ruby 2.7.0 リファレンスマニュアル) https://docs.ruby-lang.org/ja/latest/method/Kernel/m/syscall.html
サンプル
puts syscall(186)
これでOK。
ちなみに、マルチスレッドで実行するとちゃんと別々のIDが表示される
puts syscall(186)
t = Thread.new do
puts syscall(186)
sleep 5
end
t.join
OSレベルで上記のふるまいを確かめる場合は上記を実行している途中で以下を実行すれば確認できる(下記コマンドの場合は LWP
を見る)。同じ番号が表示されるはず。1
% ps -eLf | grep -e test-thread.rb -e PID
UID PID PPID LWP C NLWP STIME TTY TIME CMD
kure 15785 9657 15785 2 2 23:17 pts/1 00:00:00 ruby test-thread.rb
kure 15785 9657 15813 0 2 23:17 pts/1 00:00:00 ruby test-thread.rb
ちなみに、簡単に取得するためのExtensionを以下で見つけたりした。多分似たようなことをやってるもよう。
tomlobato/ruby-get_tid: Get the Thread ID (tid/lwp/spid) in Ruby/Linux https://github.com/tomlobato/ruby-get_tid