きどたかのブログ

いつか誰かがこのブログからトラブルを解決しますように。

z/OSのC言語でウカツにsleep関数使った話

やりたいことは単純だ。
USSの特定のフォルダに、
特定のファイルがあったら、
1秒スリープしてループする。
ファイルがなくなったらループ終了。


原案を作るのにUSSにsshログインして、
ぺぺぺっとviで書き上げた。
ほとんどマニュアルの例。
USS上で実際に動く。
使用した関数は、stat関数とsleep関数。


原案をもとに、修正対象ソースを変更。
JCL流してコンパイルからリンクエディットまでする。

ロードモジュールを動かす。
ファイルがない場合の埋め込んだログが、
JOBLOGにでている。
よし、成功したと思っていた。


数日後、いざファイルを置いてみると、
CEEDUMP吐くくらいの異常終了。


sleep関数はPOSIX(ON)にしないと動かないというではないか。
わかった、試してみよう。
JCLのPARMにPOSIX(ON)を追加。
ぐは、データセットアクセスしてるコードがfopen()できなくなった。


ふむ。stat関数は意図した通りに動くので、ファイル存在確認はできている。
書き方の変更が必要なのは、sleep関数のみだ。


ネットを調べてみる。

clock関数を使うやり方は却下、あんなCPUバカスカ使うコードは書きたくない、腐ってもシステムエンジニアだ。


selectやpollはどうだろうか。
あんまりピンとこない。
ソケットになにかが書き込まれるのを待ち受けるみたいのにはイメージがあうんだけど、ファイルが削除されたことを待ち受けるとかはイメージに合わない。

pthread_cond_timedwaitは?
これもPOSIXかぁ。

settimerとかどうだろう。
POSIX依存だとさ。ひどい。
アセンブラのSTIMERマクロがあるくせに、POSIX依存とかふざけている。


sigtimedwait関数じゃね?
MVS依存はするけど、いけそうなイメージがわいた。
sigtimedwaitで実装した。
ただ、コーディングミスで痛い目を見た。
EINVALがでる理由は、timespecの値だった。
秒に値は入れていたが、ナノに値を入れなかったせいで、ある箇所では動き、ある箇所では動かないでEINVALが返却された。


ふだん使わないC言語で何かを書くのはけっこうしんどいなぁ。しかもPOSIXってわけでもない。