2024年3月 この範囲を時系列順で読む この範囲をファイルに出力する
C言語ネタです。
セマフォを使ったプロセス間での排他制御
セマフォは異なるプロセスが共有メモリへ同時に読み書きをしないために使おうを思っています。この記事だけではどう使ったらいいか見えませんが、セマフォの機能についてはシンプルに要点を突いて分かりやすい。こういう蛇足が無い説明は好きです。
ここでは他のプロセスの挙動は説明されていませんが、同じ名前のセマフォ(この記事では"/unko")を開いて同じ様に使います。同じセマフォを持った二つのプロセスがあるとして、後から sem_wait(sem) を実行した側は先に sem_wait(sem) を実行した側が sem_post(sem) を実行するまでブロック(動作を一時停止)します。sem_trywait(sem) を用いればブロックせずに戻りますので戻り値を見て処理を続行出来ます。
自力でセマフォを作ろうと思っていましたが、この方法でいいんでないかなと。
セマフォの方針が決まれば必要なことが一通りまとまったことになるので書き始められそうです。
まずは Art-Net を丁寧に受信する処理から進めます。ネットワーク上のすべての ArtDMX(スロットデータが列挙されたパケット) と存在する送信機の一覧を取得し、別プロセスから読み出して階層的に表示することを当面の目標とします。一種の Art-Net モニタでしょうか。画面を横に3分割し、左に送信機の一覧、中間に選択された送信機が扱うユニバース、右にスロットデータといった構成です。送信機とユニバースをキーボード(カーソル)操作で選択することも習作の一部となります。
これが作れなければ ArtNetPatch など作れませんし、最終的なパッケージでも欲しい機能です。
#C言語
セマフォを使ったプロセス間での排他制御
セマフォは異なるプロセスが共有メモリへ同時に読み書きをしないために使おうを思っています。この記事だけではどう使ったらいいか見えませんが、セマフォの機能についてはシンプルに要点を突いて分かりやすい。こういう蛇足が無い説明は好きです。
ここでは他のプロセスの挙動は説明されていませんが、同じ名前のセマフォ(この記事では"/unko")を開いて同じ様に使います。同じセマフォを持った二つのプロセスがあるとして、後から sem_wait(sem) を実行した側は先に sem_wait(sem) を実行した側が sem_post(sem) を実行するまでブロック(動作を一時停止)します。sem_trywait(sem) を用いればブロックせずに戻りますので戻り値を見て処理を続行出来ます。
自力でセマフォを作ろうと思っていましたが、この方法でいいんでないかなと。
セマフォの方針が決まれば必要なことが一通りまとまったことになるので書き始められそうです。
まずは Art-Net を丁寧に受信する処理から進めます。ネットワーク上のすべての ArtDMX(スロットデータが列挙されたパケット) と存在する送信機の一覧を取得し、別プロセスから読み出して階層的に表示することを当面の目標とします。一種の Art-Net モニタでしょうか。画面を横に3分割し、左に送信機の一覧、中間に選択された送信機が扱うユニバース、右にスロットデータといった構成です。送信機とユニバースをキーボード(カーソル)操作で選択することも習作の一部となります。
これが作れなければ ArtNetPatch など作れませんし、最終的なパッケージでも欲しい機能です。
#C言語
音響も照明もデジタルコンソールを使うのが日常となりました。
これらはとても高機能で便利な機器ですが、弱点を申し上げるなら起動に時間がかかることと、瞬間停電で動作不良に陥ることがあることです。
機器に与える電源は半仮設なことが多いためコネクタの脱落や接点不良の可能性は拭えず、老朽化した劇場ですと空調器等の動作によっては瞬間停電に等しい状態に陥ることもあります。
完全停電ならともかく、瞬間停電による動作不良はクライアントに理解を得ることが難しく、ストレージへのアクセス中に電源が落ちますとシステムが深刻な支障に至ることもあります。
前置きが長くなりましたが、瞬間停電や数分の停電があってもコンソールの動作を維持する対策を施したいので「無停電電源装置」を使いたい。いわゆる「UPS」です。
UPSのバックアップ方式には様々な種類があるのでどんな状況でも安心とは言い切れませんが、無いよりは明らかに事故率を下げられます。
ただ、UPS製品は据え置きを前提にした物が多く、仕込んでバラしてを繰り返すと物理的に傷みやすい。
ならばと思ったのが、デスビとUPSをラックケースに1パッケージにしたモノはどうだ?というアイデア。デスビとはノイズフィルタとサージカットを提供する電源分配装置と言えばいいでしょうか。欲しいのは瞬間停電に対策し、電源ノイズを軽減し、サージカットをする物です。安価なUPSでもサージカットは入っています。ノイズフィルタまで入っている物は重装備の設備用となりますが、コモンモードフィルタを入れれば事足ります。
私の印象ですが、UPSと言えば「OMRON」さん。安価な普及品から高性能な重装備品まで幅広くラインナップし、何よりも保守用の交換バッテリーの入手に安心感があります。バッテリーの寿命は3-5年のため、安いだけ品はいざ交換したいときにバッテリーが手に入らないこともあるからです。
コンソール周りの消費電力は300wくらいが平均でしょうか。上には上がありますが、一番頻度の高い条件を一般条件とし、もっと必要なら複数使うなり専用品として対策する方向で。
OMRONさんの製品で19インチラックにマウント出来そうな安価な製品ですと「BX50F」でしょうか。
「BX50F」

バックアップ容量は500VA/300wなのでもう一息欲しい気もしますが、小型軽量だし、空冷余白や付属パネルを含めても2Uに収まりそうなので実用的かなと。
実は、OMRONさんのBZ50LT2をすでに使っています。一見安っぽいのですが十分に使えています。事故に遭遇したことはありませんが、試験停電させたところ数分保持しました。卓周辺で単体の消費電力が300wを越える製品は多くありませんし、BX50Fは形が違うだけで同等の製品ですから十分使えるでしょう。
#照明器具
これらはとても高機能で便利な機器ですが、弱点を申し上げるなら起動に時間がかかることと、瞬間停電で動作不良に陥ることがあることです。
機器に与える電源は半仮設なことが多いためコネクタの脱落や接点不良の可能性は拭えず、老朽化した劇場ですと空調器等の動作によっては瞬間停電に等しい状態に陥ることもあります。
完全停電ならともかく、瞬間停電による動作不良はクライアントに理解を得ることが難しく、ストレージへのアクセス中に電源が落ちますとシステムが深刻な支障に至ることもあります。
前置きが長くなりましたが、瞬間停電や数分の停電があってもコンソールの動作を維持する対策を施したいので「無停電電源装置」を使いたい。いわゆる「UPS」です。
UPSのバックアップ方式には様々な種類があるのでどんな状況でも安心とは言い切れませんが、無いよりは明らかに事故率を下げられます。
ただ、UPS製品は据え置きを前提にした物が多く、仕込んでバラしてを繰り返すと物理的に傷みやすい。
ならばと思ったのが、デスビとUPSをラックケースに1パッケージにしたモノはどうだ?というアイデア。デスビとはノイズフィルタとサージカットを提供する電源分配装置と言えばいいでしょうか。欲しいのは瞬間停電に対策し、電源ノイズを軽減し、サージカットをする物です。安価なUPSでもサージカットは入っています。ノイズフィルタまで入っている物は重装備の設備用となりますが、コモンモードフィルタを入れれば事足ります。
私の印象ですが、UPSと言えば「OMRON」さん。安価な普及品から高性能な重装備品まで幅広くラインナップし、何よりも保守用の交換バッテリーの入手に安心感があります。バッテリーの寿命は3-5年のため、安いだけ品はいざ交換したいときにバッテリーが手に入らないこともあるからです。
コンソール周りの消費電力は300wくらいが平均でしょうか。上には上がありますが、一番頻度の高い条件を一般条件とし、もっと必要なら複数使うなり専用品として対策する方向で。
OMRONさんの製品で19インチラックにマウント出来そうな安価な製品ですと「BX50F」でしょうか。
「BX50F」

バックアップ容量は500VA/300wなのでもう一息欲しい気もしますが、小型軽量だし、空冷余白や付属パネルを含めても2Uに収まりそうなので実用的かなと。
実は、OMRONさんのBZ50LT2をすでに使っています。一見安っぽいのですが十分に使えています。事故に遭遇したことはありませんが、試験停電させたところ数分保持しました。卓周辺で単体の消費電力が300wを越える製品は多くありませんし、BX50Fは形が違うだけで同等の製品ですから十分使えるでしょう。
#照明器具
機材の補助としてバンジーコードを輪にしたモノを使うことにしました。
バンジーコードとは周囲を繊維の編み込みで包んだゴム紐です。荷止めとして使われることが多いゴムです。
輪にするには端を繋げないといけませんが、バイスバーサノットと呼ばれる結び方が良さそうです。
少し難しい結び方ですが、ほどけ難いのは良いことです。
と言いつつ、これも良さそう。
#舞台の小物
バンジーコードとは周囲を繊維の編み込みで包んだゴム紐です。荷止めとして使われることが多いゴムです。
輪にするには端を繋げないといけませんが、バイスバーサノットと呼ばれる結び方が良さそうです。
少し難しい結び方ですが、ほどけ難いのは良いことです。
と言いつつ、これも良さそう。
#舞台の小物
ATXを汎用電源化するための基板を発注しました。
24ピンのATXコネクタを挿し、リセッタブルヒューズを介してXHコネクタに出力する物です。


PCBGOGOさんに発注しましたが、改めて価格を評価したところレジストやシルクの色で価格が随分違う。標準色(レジスト緑/シルク白)は安い。しかもリードタイムが短い。
これまでは気分で色を決めていましたが、見せ基板でないなら安くて早いが正義。これまで無駄遣いをしていたようです。
肝心の価格は送料別10枚で$19(日本円で2,876円)です。75x60mmサイズで1枚300円しません。サンハヤトさんの感光基板を買うより安いのに両面基板でレジストもシルクも入る。格安と言うしかありません。
送料は3,000円くらいですが、これを高いと言ったら何も始まりません。
ATX電源からは24P以外のコネクタも出ていますが、そのまま使うかコネクタを付け替えるかします。
追記
ジャンク箱を覗いて電源を見繕っていたら新品未開封のSFX(300w)が居ました。随分前に保守用としてストックした物だと思うので使うことはないでしょうし、新たなPCを組むには電力不足ですがRaspberryPiの開発環境には十分です。
ケーブルハーネスは短くします。パッケージをスッキリさせるには余計なケーブルが邪魔だからです。ちょっと面倒ですが、ATX電源のハーネスの加工を習得しておけば後で役立つかな?
この電源からはATXの24ピン、補助12vの4ピン、SATA、ペリフェラル4Pがそれぞれ1系統出ています。24ピンは今回作った基板にあてがってXHコネクタに出力し、補助12vはDCコネクタに付け替えてモニタなどの電源とし、SATAとペリフェラル4Pはそのまま残そうかなと。
#電子工作
24ピンのATXコネクタを挿し、リセッタブルヒューズを介してXHコネクタに出力する物です。


PCBGOGOさんに発注しましたが、改めて価格を評価したところレジストやシルクの色で価格が随分違う。標準色(レジスト緑/シルク白)は安い。しかもリードタイムが短い。
これまでは気分で色を決めていましたが、見せ基板でないなら安くて早いが正義。これまで無駄遣いをしていたようです。
肝心の価格は送料別10枚で$19(日本円で2,876円)です。75x60mmサイズで1枚300円しません。サンハヤトさんの感光基板を買うより安いのに両面基板でレジストもシルクも入る。格安と言うしかありません。
送料は3,000円くらいですが、これを高いと言ったら何も始まりません。
ATX電源からは24P以外のコネクタも出ていますが、そのまま使うかコネクタを付け替えるかします。
追記
ジャンク箱を覗いて電源を見繕っていたら新品未開封のSFX(300w)が居ました。随分前に保守用としてストックした物だと思うので使うことはないでしょうし、新たなPCを組むには電力不足ですがRaspberryPiの開発環境には十分です。
ケーブルハーネスは短くします。パッケージをスッキリさせるには余計なケーブルが邪魔だからです。ちょっと面倒ですが、ATX電源のハーネスの加工を習得しておけば後で役立つかな?
この電源からはATXの24ピン、補助12vの4ピン、SATA、ペリフェラル4Pがそれぞれ1系統出ています。24ピンは今回作った基板にあてがってXHコネクタに出力し、補助12vはDCコネクタに付け替えてモニタなどの電源とし、SATAとペリフェラル4Pはそのまま残そうかなと。
#電子工作
ATX(SFX)電源を汎用電源化するため、ATXコネクタを調べました。
以下がピンアサイン、規格ケーブル色、特殊ピンの機能です。
現行規格は24ピン、旧規格は20ピンです。カッコ内は20ピンの値。
ピンの並びは長手方向に1~12(10)、PIN1の隣に戻って13(11)~24(20)です。
ATX 24pin Connector Pin Assignment (20pins are in parentheses)
Cable Connector is Molex 5556.
Pcb Connector is Molex 5566.
------------
1 ( 1) +3.3v [Orange]
2 ( 2) +3.3v [Orange]
3 ( 3) GND [Black]
4 ( 4) +5v [Red]
5 ( 5) GND [Black]
6 ( 6) +5v [Red]
7 ( 7) GND [Black]
8 ( 8) PWR_OK [Gray] 起動し出力が安定すると+5vが出力されます。パイロットランプにも使用可。
9 ( 9) +5vSB [Purple] 起動していなくても電源が入力されると+5vが出力されます。パイロットランプにも使用可。
10 (10) +12v [Yellow]
11 +12v [Yellow]
12 +3.3v [Orange]
------------
13 (11) +3.3v [Orange]
14 (12) -12v [Blue]
15 (13) GND [Black]
16 (14) PS_ON [Green] GNDに落とすと起動します。NCにすると停止します。
17 (15) GND [Black]
18 (16) GND [Black]
19 (17) GND [Black]
20 (18) Rererved(-5v) [*NC] 配線されていないことが多い。されていれば-5v。
21 (19) +5v [Red]
22 (20) +5v [Red]
23 +5v [Red]
24 GND [Black]
------------
+3.3v x 4pin
+5v x 5pin
+12v x 2pin
-12v x 1pin
GND x 8pin
------------
他のコネクタも規格ケーブル色は上記と同じです。
+3.3v [Orange]
+5v [Red]
+12v [Yellow]
GND [Black]
※ ケーブルがすべて黒の製品も多い
16ピンをGNDに繋げれば起動しますので、物理スイッチを間に入れれば起動スイッチになります。
簡単な改造とは言えませんが、工作の汎用電源にはATX電源を使うといいような気がします。特にSFXの300w程度の物は小型で安価なマルチ電源と言えます。
参考:ATX/EPS電源のピンアサイン
#ガチ工作 #電子工作
以下がピンアサイン、規格ケーブル色、特殊ピンの機能です。
現行規格は24ピン、旧規格は20ピンです。カッコ内は20ピンの値。
ピンの並びは長手方向に1~12(10)、PIN1の隣に戻って13(11)~24(20)です。
ATX 24pin Connector Pin Assignment (20pins are in parentheses)
Cable Connector is Molex 5556.
Pcb Connector is Molex 5566.
------------
1 ( 1) +3.3v [Orange]
2 ( 2) +3.3v [Orange]
3 ( 3) GND [Black]
4 ( 4) +5v [Red]
5 ( 5) GND [Black]
6 ( 6) +5v [Red]
7 ( 7) GND [Black]
8 ( 8) PWR_OK [Gray] 起動し出力が安定すると+5vが出力されます。パイロットランプにも使用可。
9 ( 9) +5vSB [Purple] 起動していなくても電源が入力されると+5vが出力されます。パイロットランプにも使用可。
10 (10) +12v [Yellow]
11 +12v [Yellow]
12 +3.3v [Orange]
------------
13 (11) +3.3v [Orange]
14 (12) -12v [Blue]
15 (13) GND [Black]
16 (14) PS_ON [Green] GNDに落とすと起動します。NCにすると停止します。
17 (15) GND [Black]
18 (16) GND [Black]
19 (17) GND [Black]
20 (18) Rererved(-5v) [*NC] 配線されていないことが多い。されていれば-5v。
21 (19) +5v [Red]
22 (20) +5v [Red]
23 +5v [Red]
24 GND [Black]
------------
+3.3v x 4pin
+5v x 5pin
+12v x 2pin
-12v x 1pin
GND x 8pin
------------
他のコネクタも規格ケーブル色は上記と同じです。
+3.3v [Orange]
+5v [Red]
+12v [Yellow]
GND [Black]
※ ケーブルがすべて黒の製品も多い
16ピンをGNDに繋げれば起動しますので、物理スイッチを間に入れれば起動スイッチになります。
簡単な改造とは言えませんが、工作の汎用電源にはATX電源を使うといいような気がします。特にSFXの300w程度の物は小型で安価なマルチ電源と言えます。
参考:ATX/EPS電源のピンアサイン
#ガチ工作 #電子工作
今日もホール増員置きダヌキしてました。珍しく旗日にオフだったのですが、結構大掛かりなツアーだったので召喚された次第。
ツアーの皆様は仕事が出来る人ばかりのためタッパまで終わればバラシまでヒマですから調べ物や研究が出来るのです。
そんなワケで、コンソール画面を書く手段を新たに見つけつつ、Art-Netパッチの基本設計や要となる要素を整理し終わりました。机上作業が終わったので次は実機試験です。
VsCodeからSSHでRaspberryPiを触る方法で作業するのですが、この物理環境を今一度整備しましょう。パソコン、卓、node以外の必要な物が固定され配線されたトランク型のラップトップパソコンみたいなモノを作るです。配電盤箱よろしく中に合板を貼り付けてテキトウにビス止め出来るアルミトランクみたいなモノがあればいいでしょうか。これに電源(DC3.3v,5v,12v小型のSFX電源?)、RaspberryPi、モニタ、EtherneHubなどの基本用品と都度の課題で必要なモノを組み付けておくのです。キーボードはワイヤレスなので仕舞う場所だけ??。ここまでしておけば場所を選ばず作業出来そうです。
#ガチ工作 #器具の製作
ツアーの皆様は仕事が出来る人ばかりのためタッパまで終わればバラシまでヒマですから調べ物や研究が出来るのです。
そんなワケで、コンソール画面を書く手段を新たに見つけつつ、Art-Netパッチの基本設計や要となる要素を整理し終わりました。机上作業が終わったので次は実機試験です。
VsCodeからSSHでRaspberryPiを触る方法で作業するのですが、この物理環境を今一度整備しましょう。パソコン、卓、node以外の必要な物が固定され配線されたトランク型のラップトップパソコンみたいなモノを作るです。配電盤箱よろしく中に合板を貼り付けてテキトウにビス止め出来るアルミトランクみたいなモノがあればいいでしょうか。これに電源(DC3.3v,5v,12v小型のSFX電源?)、RaspberryPi、モニタ、EtherneHubなどの基本用品と都度の課題で必要なモノを組み付けておくのです。キーボードはワイヤレスなので仕舞う場所だけ??。ここまでしておけば場所を選ばず作業出来そうです。
#ガチ工作 #器具の製作
コンソールの画面操作では「ANSIエスケープシーケンス」を使うイメージでいましたが、「ncurses」と呼ばれる便利なライブラリがあることを今更知りました。これを使えばコンソール画面作りが楽になりそうです。
キー操作の扱いを調べていたのですが、「C言語で矢印キーの入力を完璧に検出する5つのステップ」を読んでいたら「ncurses」が便利とのこと。ここから調べを進めたところナルホドが連発。「cursesライブラリの超てきとー解説」を読むと概要がわかるような。
#C言語
キー操作の扱いを調べていたのですが、「C言語で矢印キーの入力を完璧に検出する5つのステップ」を読んでいたら「ncurses」が便利とのこと。ここから調べを進めたところナルホドが連発。「cursesライブラリの超てきとー解説」を読むと概要がわかるような。
#C言語
SharedMemory(共有メモリ)であるmmapの使い方が整理出来つつあります。
検証はこれからですが、理解出来たところをオレメモとして書いておきます。
あくまで「オレメモ」です。間違いアリアリでよろしくお願いします。
なお、mmapには様々な用法あるらしい。下記はプロセス間の共有メモリに限った使い方です。
/* mmapを使うためのライブラリ */
#include <sys/mman.h>
/* 共有メモリにテキストを代入する */
char *st; // 扱うデータの型でmmapのポインタを設定
int msize = 4096;
st = mmap( NULL, msize, PROT_READ | PROT_WRITE, MAP_ANON | MAP_SHARED, -1, 0 ); // ここまでやってからfork()でプロセスを分ける
*st = 'TEST'; // mmapに「TEST」が代入される(変数をポインタで扱う方法で扱える)
/* 使用後は共有メモリを解放する */
munmap( st, msize );
mmapの引数
1つ目(addr/NULL):mmapを定義するメモリアドレスを設定する項目だが、NULLにしておけばOSが決めてくれる。
2つ目(size/msize):確保するメモリサイズの指定。ページメモリのサイズの倍数にするベシというご意見と、欲しいメモリサイズを指定すればOSが調整してくれるというご意見など色々ある。変数の型からsizeofで得る方法(sizeof(int)など)を使われている方もいる。
3つ目(prot/PROT_READ | PROT_WRITE):読み書きモードを設定する。この書き方だと読み書き両方可能にする。
4つ目(flag/MAP_ANON | MAP_SHARED):MAP_ANONはファイルをマッピングせずに使う指定(共有メモリとして使うだけならこれでいい)、MAP_SHAREDはプロセス間で共有するという指定。
5つ目(fd/-1):ファイルディスクリプタの指定だが、上記でMAP_ANONにしているので-1で無しとする。
6つ目(offset/0):スタートアドレスからどれくらいずらしたところを使うか。
共有メモリは読み書きのタイミングをマネージしれくれませんので、何かしらの管理をしないといけません。
参考:ページメモリのサイズを取得する
#include <unistd.h>
#include <stdio.h>
long page_size = sysconf( _SC_PAGESIZE );
ついでにpipeも。
ただし、ここではpipe2(Linux固有)を使います。pipeの上位互換で引数でノンブロッキングの設定が出来るからです。通常のpipeはパイプが空の場合に有効なデータが取り出せるまで待ってしまいますがO_NONBLOCKを設定すると待ちません。
なお、以前の書き込みでpipeは単純なスタックと書きましたが、Queue程マネジメントされていないFIFOです。訂正します。
/* pipeを使うためのライブラリ */
#define _GNU_SOURCE // よくわからないけど必要なおまじない?
#include <fcntl.h> // O_*(ここではO_NONBLOCK) 定数の定義の取得
#include <unistd.h> // pipeの本体を呼ぶ
/* pipeの定義 */
int pipefd[2]; // ファイルディスクリプタとしてint配列を用いる 変数の名前は任意
if( pipe2( pipefd, O_NONBLOCK ) < 0 ) { // ファイルディスクリプタとする配列とノンブロッキングのフラグを引数にする
// pipe2の戻り値が-1なら設定エラー
}
/* pipeへの書き込み */
char *st = "TEST";
write( pipefd[1], st, strlen( st ) ); // strlenは<string.h>が必要。成功なら書き込んだバイト数、失敗なら-1が戻る。
/* pipeからの読み出し */
char buf[128];
read( pipefd[0], &buf, sizeof( buf ) ); // パイプが空の場合はEOFを得るか戻り値が0になると思われる。成功なら読み取ったしたバイト数、失敗なら-1が戻る。
/* pipeを閉じる(fork()して読み出し側書き込み側に分かれる場合はfork()した後に使わない側を閉じて運用する。もちろん終了する際にはすべて閉じる) */
close( pipefd[0] ); // 読み出しを閉じる
close( pipefd[1] ); // 書き込みを閉じる
int配列pipefdは[0]が読み出し[1]が書き込みになるファイルディスクリプタ。
#define MEMREAD 0
#define MEMWRITE 1
などとして使うとわかりやすいかも。
OSに寄りますが、スタック長は65536バイトが一般的らしい。
pipeは読み書きのタイミングをマネージしてくれます。
どちらもファイルを読み書きする手法を応用していますので、ファイルの読み書きの仕方を勉強しなおしてから取り組むとわかりやすいかもしれません。
#C言語
検証はこれからですが、理解出来たところをオレメモとして書いておきます。
あくまで「オレメモ」です。間違いアリアリでよろしくお願いします。
なお、mmapには様々な用法あるらしい。下記はプロセス間の共有メモリに限った使い方です。
/* mmapを使うためのライブラリ */
#include <sys/mman.h>
/* 共有メモリにテキストを代入する */
char *st; // 扱うデータの型でmmapのポインタを設定
int msize = 4096;
st = mmap( NULL, msize, PROT_READ | PROT_WRITE, MAP_ANON | MAP_SHARED, -1, 0 ); // ここまでやってからfork()でプロセスを分ける
*st = 'TEST'; // mmapに「TEST」が代入される(変数をポインタで扱う方法で扱える)
/* 使用後は共有メモリを解放する */
munmap( st, msize );
mmapの引数
1つ目(addr/NULL):mmapを定義するメモリアドレスを設定する項目だが、NULLにしておけばOSが決めてくれる。
2つ目(size/msize):確保するメモリサイズの指定。ページメモリのサイズの倍数にするベシというご意見と、欲しいメモリサイズを指定すればOSが調整してくれるというご意見など色々ある。変数の型からsizeofで得る方法(sizeof(int)など)を使われている方もいる。
3つ目(prot/PROT_READ | PROT_WRITE):読み書きモードを設定する。この書き方だと読み書き両方可能にする。
4つ目(flag/MAP_ANON | MAP_SHARED):MAP_ANONはファイルをマッピングせずに使う指定(共有メモリとして使うだけならこれでいい)、MAP_SHAREDはプロセス間で共有するという指定。
5つ目(fd/-1):ファイルディスクリプタの指定だが、上記でMAP_ANONにしているので-1で無しとする。
6つ目(offset/0):スタートアドレスからどれくらいずらしたところを使うか。
共有メモリは読み書きのタイミングをマネージしれくれませんので、何かしらの管理をしないといけません。
参考:ページメモリのサイズを取得する
#include <unistd.h>
#include <stdio.h>
long page_size = sysconf( _SC_PAGESIZE );
ついでにpipeも。
ただし、ここではpipe2(Linux固有)を使います。pipeの上位互換で引数でノンブロッキングの設定が出来るからです。通常のpipeはパイプが空の場合に有効なデータが取り出せるまで待ってしまいますがO_NONBLOCKを設定すると待ちません。
なお、以前の書き込みでpipeは単純なスタックと書きましたが、Queue程マネジメントされていないFIFOです。訂正します。
/* pipeを使うためのライブラリ */
#define _GNU_SOURCE // よくわからないけど必要なおまじない?
#include <fcntl.h> // O_*(ここではO_NONBLOCK) 定数の定義の取得
#include <unistd.h> // pipeの本体を呼ぶ
/* pipeの定義 */
int pipefd[2]; // ファイルディスクリプタとしてint配列を用いる 変数の名前は任意
if( pipe2( pipefd, O_NONBLOCK ) < 0 ) { // ファイルディスクリプタとする配列とノンブロッキングのフラグを引数にする
// pipe2の戻り値が-1なら設定エラー
}
/* pipeへの書き込み */
char *st = "TEST";
write( pipefd[1], st, strlen( st ) ); // strlenは<string.h>が必要。成功なら書き込んだバイト数、失敗なら-1が戻る。
/* pipeからの読み出し */
char buf[128];
read( pipefd[0], &buf, sizeof( buf ) ); // パイプが空の場合はEOFを得るか戻り値が0になると思われる。成功なら読み取ったしたバイト数、失敗なら-1が戻る。
/* pipeを閉じる(fork()して読み出し側書き込み側に分かれる場合はfork()した後に使わない側を閉じて運用する。もちろん終了する際にはすべて閉じる) */
close( pipefd[0] ); // 読み出しを閉じる
close( pipefd[1] ); // 書き込みを閉じる
int配列pipefdは[0]が読み出し[1]が書き込みになるファイルディスクリプタ。
#define MEMREAD 0
#define MEMWRITE 1
などとして使うとわかりやすいかも。
OSに寄りますが、スタック長は65536バイトが一般的らしい。
pipeは読み書きのタイミングをマネージしてくれます。
どちらもファイルを読み書きする手法を応用していますので、ファイルの読み書きの仕方を勉強しなおしてから取り組むとわかりやすいかもしれません。
#C言語
中華電機を覗いていたらこんな電圧計を発見!

調整に使うモノではないと思いますが、パイロットランプを兼ねて受電電圧の大雑把な確認には使えると思います。100v200vを間違っていないか、ドロップしていないかの確認ってことです。
これのいいのは薄いことです、奥行きが18mmしかありません。これまでは丸穴で小型の物は奥行きが50mm以上ありましたが、ここまで薄いなら箱のサイズに自由度が出ます。例えばTRUE1のレセプタクルを羊かん箱に実装すると奥行のために箱の表面には大きなブランクが出来ますが、ここを埋める配置で使えそうなので良いかなと。直電源のTRUE1化を少しづつ進めていますが、思案中の分岐ボックスに使えるかなと。
#器具の製作

調整に使うモノではないと思いますが、パイロットランプを兼ねて受電電圧の大雑把な確認には使えると思います。100v200vを間違っていないか、ドロップしていないかの確認ってことです。
これのいいのは薄いことです、奥行きが18mmしかありません。これまでは丸穴で小型の物は奥行きが50mm以上ありましたが、ここまで薄いなら箱のサイズに自由度が出ます。例えばTRUE1のレセプタクルを羊かん箱に実装すると奥行のために箱の表面には大きなブランクが出来ますが、ここを埋める配置で使えそうなので良いかなと。直電源のTRUE1化を少しづつ進めていますが、思案中の分岐ボックスに使えるかなと。
#器具の製作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131