質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

UNIX

UNIXとは、AT&Tのベル研究所で開発されたコンピューター用のマルチユーザー・マルチタスクのオペレーションシステム(OS)です。政府や教育機関や研究所で広範囲に採用されています。

Q&A

解決済

1回答

1355閲覧

(UNIX)ある関数を一定の周期で呼ぶには

退会済みユーザー

退会済みユーザー

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

UNIX

UNIXとは、AT&Tのベル研究所で開発されたコンピューター用のマルチユーザー・マルチタスクのオペレーションシステム(OS)です。政府や教育機関や研究所で広範囲に採用されています。

0グッド

0クリップ

投稿2017/10/20 11:49

いつもお世話になってます。
この間、iputilsパッケージのarpingpingのソースコードを見ていて気になったことがあります。

どちらのプログラムも一定の周期で対象にパケットを送るという事をしていますが、arpingではalarm()を一秒に設定し、sigalrmのシグナルハンドラとしてパケットを送信する関数を登録していますが、pingでは今回送信する時間から前回送信した時間を引きその差分を見て新たに送信するかどうかを決定しているようです。

alarm()を設定し、シグナルを見るのがいいのか、毎回時間を取得しそれを調べるのがいいのかどちらが望ましいのでしょうか?
よろしくお願いします。

(arpingはcatcher関数とmain関数、pingはpinger関数に該当の箇所があります。)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

はっきりとわかっているわけではないですが

alermは**スケジューリングの遅延により、プロセスの実行に不定量の遅延が起きる可能性がある(※)**ということなので、パケット送出感覚にそれほどの精度が必要ないケースと言えると思います。

一方pingは特定ホストへの到達性を確認する目的である一定時間ごとに繰り返し(場合によって何度も)echoパケットを送出する動作をしますが、alerm,sleep,setitimerなどを使うと※の特性によりパケット送出間隔のずれが蓄積することを嫌って今あるような実装になっているのではないかと思います。

さて、どちらが一般的かといえば「どちらでもない」と思います。その機能の要件によって何がよいかは変わると思います。例えば時計の秒針を毎秒ごとに表示するようなアニメーションを考えてみてください。固定的に遅延時間を1秒としてaltermを使おうと考えるプログラマーはいないと思います。そうしてしまうとどんどん表示時間がずれていってしまうからです。このような場合は「最後に秒針を更新した時間を考慮して、次の更新は何ミリ秒後とすべきか」を常に配慮する必要があるでしょう。

投稿2017/10/20 13:40

編集2017/10/20 14:02
KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/10/20 13:59

回答ありがとうございます。 alarmはスケジューリングの影響を受ける訳ですね。 どちらが優れているというのではなく状況に応じて使い分ける必要があるということですか。 勉強になりました!
KSwordOfHaste

2017/10/20 14:03

どのタイマー関連機能を使ってもスケジューリングの影響はうけると思います。回答がちょっと不適切な表現だったので若干訂正しました。ポイントは「固定的な待ち時間としずれは許容する」か「待ち時間を調整してずれを最小化するか」の違いだと思います。
退会済みユーザー

退会済みユーザー

2017/10/21 05:29

了解しました。 訂正ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問