割り込み関数に関する質問

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
西村

割り込み関数に関する質問

#1

投稿記事 by 西村 » 16年前

現在signal関数について勉強しています。signal関数で割り込み時に実行される関数 sig_handler という一秒毎に時間を取得する関数を作りました。
int sig_handler(){
  int sec=0;
  sec++;
  return(sec);
}
として、一秒ごとに返り値を得るようにしたかったのですが、signal関数というのは返り値をもつ関数を指定出来ないことを知りました。この場合はsignal関数を諦めて sigaction関数 というのに切替えた方が良いのでしょうか?なにやらsigaction関数はやたらややこしそうなのですが・・・

たかぎ

Re:割り込み関数に関する質問

#2

投稿記事 by たかぎ » 16年前

処理系不明なので一般論でしか回答できませんが...

sigaction関数は非標準なので使えるかどうか分かりません。
signal関数で指定できるシグナルの種類の中には、一定時間でハンドラを呼び出すようなものは標準ではサポートされません。

西村

Re:割り込み関数に関する質問

#3

投稿記事 by 西村 » 16年前

返答ありがとうございます。
そして失礼しました。処理系は普通にgccでCです。

>signal関数で指定できるシグナルの種類の中には、一定時間でハンドラを呼び出すようなものは標準ではサポートされません。
いえ、
void sig_handler(){
  int sec=0;
  sec++;
  printf("%d",sec);
}
とかにした場合、きちんと一秒ごとにprintfを呼び出すことが出来る、という状況には出来ているのです。遠回しな質問の仕方をしてすみません。つまり、戻り値を返さない関数から、どうにかmainに値を取ることは出来ないでしょうか、というのが質問になります。

>sigaction関数は非標準なので使えるかどうか分かりません。
一応、使えるみたいです。前準備がややこしそうで手を出してないのですが……sigactionの方が利点が多かったりするのでしょうか?

……あれ?最初の質問が僕のPCからは途中で切れてる?

たかぎ

Re:割り込み関数に関する質問

#4

投稿記事 by たかぎ » 16年前

> 処理系は普通にgccでCです。

ターゲットが不明ですね。
GCCといっても、Linux、FreeBSD、MacOSX、Cygwin、MinGW、組込み向けのフリースタンディング環境では状況が異なります。

それ以前に...
int sig_handler(){
  int sec=0;
  sec++;
  return(sec);
}
は常に1を返すので、定数に置き換えてしまっても問題ないはずです。

西村

Re:割り込み関数に関する質問

#5

投稿記事 by 西村 » 16年前

返答ありがとうございます。

>GCCといっても、Linux、FreeBSD、MacOSX、Cygwin、MinGW、組込み向けのフリースタンディング環境では状況が異なります。

そうなんですか。基本で知らないことが多すぎで申し訳ないです。因みにLinuxです。

>常に1を返すので、定数に置き換えてしまっても問題ないはずです。

printfで試した時はsecに+1をどんどん乗算してくれていたので、そのノリでreturnでもsecを1、2、3・・・と返してくれると思っていたのですが・・・なるほど、これは根本的なやりかたのミスなんですね。
signalではいき詰まるっぽいんで sigaction に挑戦してみます。

西村

Re:割り込み関数に関する質問

#6

投稿記事 by 西村 » 16年前

ふと、自分の抱えている疑問の解決の仕方がいきなり分かりました。
考えてくれた方々、本当にありがとうございました。

しかし、こんなにいきなり思い付くってこともあるのかと驚きました。

閉鎖

“C言語何でも質問掲示板” へ戻る