トップページ > プログラム > 2014年10月11日 > Ym4Peb6E

書き込み順位&時間帯一覧

2 位/212 ID中時間01234567891011121314151617181920212223Total
書き込み数0000000001200001011000006



使用した名前一覧書き込んだスレッド一覧
デフォルトの名無しさん
C言語なら俺に聞け(入門編)Part 126

書き込みレス一覧

C言語なら俺に聞け(入門編)Part 126
543 :デフォルトの名無しさん[sage]:2014/10/11(土) 09:19:38.90 ID:Ym4Peb6E
>>532
1) について
・semget システムコールで生成する System V セマフォであれば、プロセス間の同期/排他制御を実装できる
・(Linux を含む)UNIX で利用できるセマフォには、System V セマフォの他にも
 POSIX スレッド間の同期/排他制御を実現する POSIX セマフォがある
 今回のケースはプロセス(=プログラム)を対象としているから、System V セマフォを使用する
・ただしセマフォは(オーバヘッドは小さいが)制御の難しい低水準操作であり、一般には(オーバヘッドを嫌う)
 System V 共用メモリ への操作に対する同期/排他制御を目的として利用する
 今回のケースのようなファイルへの操作に対する同期/排他制御が目的ならば、一般には(使い方の簡単さの順に)
 ファイルロック、FIFO(名前付きパイプ)、UNIXドメインソケット、System V メッセージ等から選んで使う
・ただし残念ながら今回のケースではプログラムCから起動するシェルプログラムもファイルを操作しているから、
 (flock システムコールを前提とする)ファイルロックは採用できない
 あるいはプログラムCで(シェルを介さず)ローテート処理を(C言語で)実装できるのなら、ファイルロックが最も楽
・もし将来的にログ機能を拡張する構想があるのなら、プログラムAとBをクライアント、プログラムCをログサーバと
 見立て、その間を FIFO または UNIXドメインソケット で結ぶ設計も検討するのが望ましいだろう
2) については >>534 の方法で解決できたはず

あと、ここら辺はUNIXシステムプログラミング全般に関わる話題だから、以下のスレでの質問が適切だと思われ
・UNIXプログラミング質問すれ Part10
  http://peace.2ch.net/test/read.cgi/tech/1303113996/

>>539
上で示したように、System V セマフォと POSIX セマフォは、(セマフォという概念は同じだけど)全く別の操作だ
両者の違いを正しく理解していれば、「実装によっては....」みたいに混乱することはない

>>541
もしプログラム(=プロセス)間のファイルロックが本当にすりぬけているなら、それはOS(Linux)のバグだ
>>539 と同様に、UNIXシステムプログラミングの理解が不十分だと思われ
C言語なら俺に聞け(入門編)Part 126
546 :デフォルトの名無しさん[sage]:2014/10/11(土) 10:05:41.14 ID:Ym4Peb6E
>>545
基本的に POSIX セマフォはプロセス間で用いるものだよ
中には(NPTL のように)プロセス間で利用できるよう拡張された実装もあるけど、それは例外的な存在でしかない
一部の例外を取り上げて、それをもって POSIX スレッド全体の定義であるかのように扱うのは、
UNIXシステムプログラミングの理解が不十分であると言わざるを得ない

ましてや今回のケースは同期/排他制御の対象がプロセス間(=プログラム間)であると>>532に明記されているのだから、
これを実現するのには単純でAPI仕様/実装仕様、共に安定している System V セマフォで十分に対応できる
これを、わざわざ難しい POSIX セマフォと絡めようとする発想は、単なる知識自慢をしたいだけに見えてしまう
C言語なら俺に聞け(入門編)Part 126
547 :デフォルトの名無しさん[sage]:2014/10/11(土) 10:07:07.88 ID:Ym4Peb6E
いきなり >>546 の冒頭を間違えていたから、訂正する
X: 基本的に POSIX セマフォはプロセス間で用いるものだよ
O: 基本的に POSIX セマフォは POSIX スレッド間で用いるものだよ
C言語なら俺に聞け(入門編)Part 126
551 :デフォルトの名無しさん[sage]:2014/10/11(土) 15:38:34.99 ID:Ym4Peb6E
>>549
そこまで>>549がプロセス間の同期/排他制御にも POSIX セマフォを使いたいのなら、
>>549 は POSIX セマフォを何の疑いも無く使い続けていればいいんじゃないかな?
(スレッド間ではなく)プロセス間で POSIX セマフォを使った場合に起こる問題については
以下で解説されているので、もしその気になったなら読めばいいと思うよ
・unix - Differences between System V and Posix semaphores - Stack Overflow
  http://stackoverflow.com/questions/368322/differences-between-system-v-and-posix-semaphores
問題に触れているのは、11番の "Two major problems with POSIX shared/named semaphores" で始まるレスだ

というか、>>543の後半で書いたように、今回のファイルの排他制御という質問(>>532)に対して、
セマフォを使うという発想そのものが「UNIX では」不適切である可能性が高い
質問者である >>532 には「セマフォは一時置いといて、代わりにファイルロック/FIFO/ソケットを使う検討に
着手した方が、期待した最終的なゴールへより早く辿り着けるはずだ」と伝えたい

Windows であればファイルオブジェクトの排他制御にセマフォを使うのは常識だし、
それどころかプロセスは重いからありとあらゆる並行処理にスレッドを使う
それに対して UNIX だとプロセスは比較的軽いので、メモリ保護され実装も容易なプロセスが多用される
ここら辺の差異は、Windows プログラマが UNIX プログラミングを始めた時、最初にとまどう箇所になる
(逆に UNIX プログラマはありとあらゆる並行処理にスレッドを使わざるをえない Windows にとまどう....)
>>532 は UNIX の IPC(プロセス間通信)技術について一通り勉強しておいたほうが、今後の役に立つと思う
C言語なら俺に聞け(入門編)Part 126
555 :デフォルトの名無しさん[sage]:2014/10/11(土) 17:42:58.72 ID:Ym4Peb6E
>>553
どこが「変なコト」なのかな?
「スレッド間の同期/排他制御には POSIX セマフォを、プロセス間であれば System V セマフォを使う 」という
UNIXシステムプログラミングにおける当たり前(>>554 が言うところの「常識」)の話をしているつもりなんだけどな....
で、>>539 が「POSIX セマフォとSystem V セマフォは実装によりけり」みたいな質問者を惑わせる
「変なコト」を言っているから、間違っているよと >>534 で指摘しただけだよ

もしこれを間違っていることにしたいのなら、言い換えると:
 「実装されているプラットフォームであれば、
  プロセス間の同期/排他制御に POSIX セマフォを使っても何ら問題は無い」、
つまり:
 「( >>551 で示した)Stack Overflow のレスで指摘されている話は、つまらない些細な問題だ」
と言いたいのなら、その根拠を説明しなさい

ただし、>>549 にあるような:
 「じゃあsem_initの第二引数psharedはなんの為にあるっていうんですかー!」
などという、プログラミングの経験が浅い人にありがちな「変なコト」を根拠にするのは勘弁願いたい

さて「変なコト」を言ってるのは私かな?君かな?
それとも捨て台詞を吐いて逃げ出すのかな?
C言語なら俺に聞け(入門編)Part 126
556 :デフォルトの名無しさん[sage]:2014/10/11(土) 18:17:21.15 ID:Ym4Peb6E
アンカミスを訂正
X: 「変なコト」を言っているから、間違っているよと >>534 で指摘しただけだよ
O: 「変なコト」を言っているから、間違っているよと >>543 で指摘しただけだよ


※このページは、『2ちゃんねる』の書き込みを基に自動生成したものです。オリジナルはリンク先の2ちゃんねるの書き込みです。
※このサイトでオリジナルの書き込みについては対応できません。
※何か問題のある場合はメールをしてください。対応します。