トップ «前の日記(2008-03-11) 最新 次の日記(2008-03-13)» 編集

Orz日記 by Akio Morita

ToDo:

  • 15 SAD Fit[]回りの障害事例の解析
  • 10 smart pointer版PEGクラスの再実装(Left Recursionまわり)
2006|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|06|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|07|08|09|10|11|12|
2013|01|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|06|07|08|10|12|
2016|01|02|03|05|06|08|10|11|
2017|01|02|03|04|05|06|07|09|10|11|12|
2018|01|02|03|04|06|07|08|09|10|11|12|
2019|01|03|04|05|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|12|
2024|01|02|03|04|05|06|07|08|09|10|11|

2008-03-12 [長年日記]

_ [SAD]Execvpe[], Execvp[]実装

Execve[]へのフロントエンドとして Execvpe[]と Execvp[]を実装しました。

Execvp[file_, {argv___}, options___]は、 execvp(3)相当でファイル名と引数列を渡すと 必要ならPATH変数で指定された検索パスから外部コマンドを 探し出し、現状の環境変数を引き継いで Execve[]します。

Execvpe[file_, {argv___}, {env___}, options___]は、 Execvp[]に環境envを渡せるようにしたものです。

なんで、execvpe(3)が無いんだろう... (execve(2)は、PATHの自動検索は行わないのがポイント)

_ [SAD]BidirectionalPipe[]再実装

前々から、やろうとしていた BidirectionalPipe[]の High Level定義への 置き換えを実施しました。 これで、Fortranと Cの間の文字列受け渡し(null終端忘れてるとか...) などの問題や、execlp(3)を使っているのに、コマンド名以外の引数を 渡せない問題が解消されます。

新しいプロトタイプは、以下の通り。

BidirectionalPipe[file_String, {argv___String}, Options___]

オプションとしては、Execve[]へのオプション(ForceCloseOnExec, CloseStd) や、子プロセスのIDを受け取るための PID:>varオプション、 環境を渡すための Environments->{env___String}オプションが使えます。 デフォルトでは、呼び出し時点の環境全体が子プロセスへ渡されます。

例題

OpenRead["!ls -l /usr/include"]相当のことを BidirectionalPipe[]で書くと

{in, out} = BidirectionalPipe["/bin/ls", {"ls", "-l", "/usr/include"}, PID:>pid];
l = Table[If[s = Read[in, String]; s === EndOfFile, Break[], s], {Infinity}];
Close[in]; Close[out];
Wait4[pid];

と、なります。 注意すべきは、閉じるべきファイル記述子が送信/受信用の二つあること、 子プロセスの最後を看取ってやる必要があることです。 通信終了後に子プロセスが自発的に死なない場合やエラー等で 強制切断するときは、Kill[]でシグナルを送って親プロセスから 明示的に殺す必要があります。 (パイプを閉じれば、子プロセス側では 読み込みに対しては EOF、 書き込みに対しては SIGPIPEが発生するので、例外処理が正しく 実装されている場合は read/write発行時には死んでくれる筈ですが、 内部で無限ループしたりすると親プロセスが死ぬまで残留することに なるので、停止が期待できない場合にはやはり明示的に殺す必要があります。) また、Kill[]で明示的に殺した場合も Wait[]かWait4[]で 最後を看取らないとプロセステーブル上のリソースは開放されないので unix初心者は要注意。

_ [LHC]LHCb見学してきました

KEKから来た国際企画課長がLHCbを見学するのに同行しての LHCb見学。

解説は、LHCb Spokespersonの中田先生


カテゴリー: Admin | Emacs | EPICS | Fortran | FreeBSD | GCC | hgsubversion | IPv6 | KEKB | LHC | Lisp | LLVM | MADX | Ryzen | SAD | samba | tDiary | unix | WWW | YaSAI | お仕事 | イベント | 出張 | 宴会 | 数学 | 艦これ | 買いもの | 追記 | 雑記