FreeBSD portsのptx-kmodに付属しているrecptx.plをfbsdpt3で用いると、sysctlの部分でPermission deniedになるようです。開いているデバイスにsysctlをかけないように、id:f99aq 氏はsysctlの位置を変えて回避したようです。
ただこれではsysctl中はデバイスがフリーになっているので、その間に別のプロセスがデバイスを開いちゃう時間が増大し、スレッドセーフ的には気持ち悪さ++らしいです。
一応こんな感じにロックファイルを使うと完璧じゃないけど気持ち悪さの上昇が抑えられるみたいです。/tmp/.recptx.lockをあらかじめ用意しておくといいらしいです。ついでにマルチカード対応もおまけしとくよって。
--- /usr/ports/multimedia/ptx-kmod/work/ptx-20111212/tools/recptx.pl 2011-12-14 04:26:37.000000000 +0900 +++ /usr/local/bin/recptx.pl 2014-09-29 13:37:17.000000000 +0900 @@ -252,39 +252,46 @@ # # select device # -# TODO: multicard (/dev/ptx1, /dev/ptx2, ...) -# -open($t, "<", "/dev/ptx0.${tuner}0"); -if ($t) { - $dev = "/dev/ptx0.${tuner}0"; - $mib = "dev.ptx.0.${tuner}0"; -} else { - open($t, "<", "/dev/ptx0.${tuner}1"); - if ($t) { - $dev = "/dev/ptx0.${tuner}1"; - $mib = "dev.ptx.0.${tuner}1"; - } else { - die("device busy"); +$tunerlock = '/tmp/.recptx.lock'; +open(TUNERSCAN, "< $tunerlock") or die "Can not open lock file ${tunerlock}"; +flock(TUNERSCAN, 1); + +$deviceFound = false; +foreach $card ('0') # Change here for multi-tuner. Ex ('0', '1') +{ + foreach $port ('0', '1') + { + if(open($t, "<", "/dev/ptx${card}.${tuner}${port}")) + { + $dev = "/dev/ptx${card}.${tuner}${port}"; + $mib = "dev.ptx.${card}.${tuner}${port}"; + $deviceFound = true; + last; + } } + + last if($deviceFound); } +die("device busy") if(!$deviceFound); + + # # recording # +close $t; system("/sbin/sysctl $mib.freq=$freq >/dev/null 2>&1"); - eval { local $SIG{ALRM} = sub { die "alarm¥n" }; alarm $duration; $pid = fork(); if ($pid) { - close $t; wait; } else { $cmd = sprintf($cmdfmt, $dev, $filename); - close $t; - exec("$cmd"); + close(TUNERSCAN); + exec($cmd); } alarm 0;
っていうことを通りすがりのおばさんが言ってました。正直私にはなんのことやらさっぱりです。
[参照]
Comments