reptyrとは"re-ptying"するためのプログラムで、起動中のプロセスを新しい別のターミナルにもってくることができます。うっかりscreenやtmuxの外で起動してしまった長い時間のかかるバッチ処理を、起動したままscreenの中にもってくることができます。PID現在のターミナル内にもってきたいプロセスのpidを引数にします。attach後は、そのプロセスの入出力は^Cや^Zも含めて新しいターミナル側を向きます。それscreenifyでできるよscreenifyと呼ばれるスクリプトが昔からあって、それはgdbつかって似たようなことをやってるらしいです。reptyrならもっとうまくできます。従来のscreenifyには以下のような問題がありました。screenifyでattachしたプロセスは、元のターミナルから入力をうけつけてしまうncursesをつかってるプログラムをscreenifyすると、そのプログラムはwindowのリサイズがとれなくなるscreenifyした新しいターミナルでは^Cがきかないreptyrはこういった問題を全部解決できます。移植性reptyrは対象プロセスを操作するのにptraceをつかっているのでLinuxに強く依存しており、Linuxだけをサポートしています。SolarisやBSDに移植することも技術的には可能ですが、現状はプラットフォーム固有の部分を抽象化するようにはデザインされていないようです。ARMをサポートしています。他のアーキテクチャへの対応はarch以下に対応コードを追加すれば比較的容易です。Maverick以降ではptraceの機能がデフォルトで無効になっています。以下コマンドで一時的に有効にできます。/proc/sys/kernel/yama/ptrace_scoperootで/etc/sysctl.d/10-ptrace.confを編集すると永続的に変更できます。ptrace_scopeに関する詳細な説明もここに書いてあります。やってるの?ソースを追ってみたところ以下のような処理をしているようです。reptyrプロセス側でptyをつくるattach対象のプロセスのttyのtermios設定をptyにコピーするptraceで対象プロセスをattachしてレジスタ内容を一旦退避attachしたプロセス側でmmapし、そこにreptyrプロセス側でつくったptyをコピーattachしたプロセス側でコピーしたptyをopenし、setsid〜ioctlでそこに制御端末を割り当てるattachしたプロセス側でdup2して入出力をttyに向けるレジスタ内容を復元、後始末してptraceをdetachreptyrのキモは5の制御端末をptyに割り当てるところで、これをすることによって従来のscreenifyの問題が回避できます。ioctlのTIOCSCTTYするだけではうまくいかないのでちょっとしたトリックが必要です。使用されているそうです。(たぶんリ・ピーティーワイアー)のように発音してもよいそうです。制約backgroundにしたときは前のターミナルでbgやfgを実行する必要があります。background制御はshellがやっているので、これを直すにはshell側に手をいれる必要があります。現状では子プロセスがあるプロセスはattachできません類似のものinjcodeneercs参考http://blog.nelhage.com/2011/01/reptyr-attach-a-running-process-to-a-new-terminal/http://blog.nelhage.com/2011/02/changing-ctty/http://blog.habets.pp.se/2009/03/Moving-a-process-to-another-terminalまとめreptyrは1000行くらいの小さなプログラムですが、なかなかおもしろいハックだと思うので興味がある方はソースを読んでみて下さい。|Cをつかってるとtupleっぽいものがあれば便利なのに、と思うときが時々あります。tuple;のようにして構造体をつかえばいいのですが、必要になるたびにこれをするのはちょっとめんどくさいですよね。いうわけで色々試行錯誤してみたところ、以下のようにしてunionの配列にするというのがそこそこ便利だったので紹介します。initializerをつかえば初期化もまあそこそこ書きやすいし、型の組み合わせもある程度柔軟にできます。C++ではなくあえてCをつかうような人の多くは独自のコンテナライブラリのようなものをもってると思いますが、上記のようなtupleがあれば便利な場面は結構あるのではないかと思います。