ページ 11

このプログラムで割り込みが起こっている部分はどこなのでしょうか。

Posted: 2012年12月10日(月) 19:04
by 青菜
以下のプログラムで内部割り込みが起こっているのはどこなのでしょうか。システムコールを呼び出すexit(1)は
そうだと思うのですが、他にはあるでしょうか。
また、外部割り込みは標準入力をするscanfのみで合っているとおもうのでしょうがいかがでしょうか。

回答よろしくお願いします。

コード:

#include<stdio.h>
#include<stdlib.h>

int fact(int x)
{
	if (x==0){
		return 1;
	}
	else{
		return x*fact(x-1);
	}
}

main()
{
	int x;
	printf("Input non-negative integer\n");
	scanf("%d", &x);
	if(x<0){
		printf("Non-negative integer !\n");
		exit(1);
	}
	else{
		printf("%d\n", fact(x));
	}
}


Re: このプログラムで割り込みが起こっている部分はどこなのでしょうか。

Posted: 2012年12月10日(月) 19:39
by softya(ソフト屋)
環境が書かれていないので何処で内部割り込み・外部割り込みが起こるかはC言語の実装によりますが、OS任せだとそんな事を意識する必要もないと思います。

あえて書くなら
入出力は、外部割り込みが関連する可能性が高いでしょう。
OSのコールは、入出力やexitやmain終了後に発生します。

Re: このプログラムで割り込みが起こっている部分はどこなのでしょうか。

Posted: 2012年12月11日(火) 00:17
by 青菜
失礼しました、割り込みが起こっているところではなく、各々の割り込みを"呼び出す"部分でした。
環境はよくわかりません。

Re: このプログラムで割り込みが起こっている部分はどこなのでしょうか。

Posted: 2012年12月11日(火) 00:25
by softya(ソフト屋)
青菜 さんが書きました:失礼しました、割り込みが起こっているところではなく、各々の割り込みを"呼び出す"部分でした。
環境はよくわかりません。
環境を限定しないとこの話は、割り込み自体を想定できません。
マイコンなどでOSなしで動いている場合と、パソコンで動いている場合では動作がかなり違うからです。
あと、どのぐらいの知識があるかとか、どのぐらいの深さの話をしたいのか限定する必要もあります。
OSのスーパーバイザレベルとか、システムコールとかどの程度理解されていますか?
分かっているCPUやOSを説明してもらったほうが良いです。

Re: このプログラムで割り込みが起こっている部分はどこなのでしょうか。

Posted: 2012年12月11日(火) 00:41
by 青菜
softya(ソフト屋) さんが書きました:
青菜 さんが書きました:失礼しました、割り込みが起こっているところではなく、各々の割り込みを"呼び出す"部分でした。
環境はよくわかりません。
環境を限定しないとこの話は、割り込み自体を想定できません。
マイコンなどでOSなしで動いている場合と、パソコンで動いている場合では動作がかなり違うからです。
あと、どのぐらいの知識があるかとか、どのぐらいの深さの話をしたいのか限定する必要もあります。
OSのスーパーバイザレベルとか、システムコールとかどの程度理解されていますか?
分かっているCPUやOSを説明してもらったほうが良いです。

問題文には環境の点には触れていないので、私の学校で使っているものとします。
Linux 64bitのものを使用しています。
知識はあまりありません。
システムコールにはどんなものがあるかくらいの知識しかなく、スーパーバイザレベルなるものは全く知りません(学校でも確か触れていませんでした)。

定期テストで答えられるほどのレベルの話で、あまり深い内容まで入らなくても大丈夫です。

回答よろしくお願いします。

Re: このプログラムで割り込みが起こっている部分はどこなのでしょうか。

Posted: 2012年12月11日(火) 00:57
by softya(ソフト屋)
softya(ソフト屋) さんが書きました:環境が書かれていないので何処で内部割り込み・外部割り込みが起こるかはC言語の実装によりますが、OS任せだとそんな事を意識する必要もないと思います。

あえて書くなら
入出力は、外部割り込みが関連する可能性が高いでしょう。
OSのコールは、入出力やexitやmain終了後に発生します。
軽く説明するなら、上に書いたとおりです。
もう少し細かく書けば、入出力の関数は外部割り込みと内部割り込みが発生する可能性があります。
ただし、OSによって管理されているので実際には外部割り込みは直接は発生しません。
OSに対してのシステムコール(内部割り込み)はexit()やmain終了後となります。

Re: このプログラムで割り込みが起こっている部分はどこなのでしょうか。

Posted: 2012年12月11日(火) 07:18
by beatle
僕が知ってるLinuxの実装だと、有名なシステムコール open, close, read, write があります。
printfなどは、バッファが満杯になったときにwriteを呼び出すようになっていると思います。
青菜 さんが書きました:システムコールを呼び出すexit(1)はそうだと思う
Linux(というかUnix)の世界では、括弧の中にmanの章番号を書くことが多いので、
exit(1)と書くと1章のexitと勘違いするかもしれません。

マニュアルの章立て
2章はシステムコール、3章はライブラリ関数なので、ライブラリ関数のexitなら
exit(3)
となります。

ちなみに
man 3 exit
というように、希望する章番号を渡せますので活用して下さい。

Re: このプログラムで割り込みが起こっている部分はどこなのでしょうか。

Posted: 2012年12月11日(火) 15:20
by 青菜
beatle さんが書きました:僕が知ってるLinuxの実装だと、有名なシステムコール open, close, read, write があります。
printfなどは、バッファが満杯になったときにwriteを呼び出すようになっていると思います。
ということは結果的にprintfもシステムコールを呼び出すようになっているということですね!
beatle さんが書きました: Linux(というかUnix)の世界では、括弧の中にmanの章番号を書くことが多いので、
exit(1)と書くと1章のexitと勘違いするかもしれません。
初めて知りました。以後気をつけます。

Re: このプログラムで割り込みが起こっている部分はどこなのでしょうか。

Posted: 2012年12月11日(火) 15:41
by 青菜
softya(ソフト屋) さんが書きました: OSに対してのシステムコール(内部割り込み)はexit()やmain終了後となります。
beatle さんが書きました:僕が知ってるLinuxの実装だと、有名なシステムコール open, close, read, write があります。
printfなどは、バッファが満杯になったときにwriteを呼び出すようになっていると思います。
あれ、ということはやっぱりprintfはここでの解答”内部割り込みを呼び出す部分”にはならないのでしょうか。

Re: このプログラムで割り込みが起こっている部分はどこなのでしょうか。

Posted: 2012年12月11日(火) 15:55
by softya(ソフト屋)
LinuxのC言語の標準関数の中をトレースしたことがないので断言できないことをお断りしておきます。

scanfの場合はシステムコール(内部割り込み)で情報を取得してこないと話しにならないのでシステムコールは確実です。
ただし、OSが管理しているキーボードの情報取得は外部割り込みが発生しますが、これとstdinのファイルディスクリプタが直接接続されているわけではない(OS内でバッファリングされる)ので答えとしては微妙です。
同様にprintfされた情報はバッファに貯められた後最終的にstdoutファイルディスクリプタを使ってシステムコールで書きだされますが、これもOS内でバッファリングされてビデオ表示回路に直接データが送られるわけではありません。なので外部込みを利用するか言われれば微妙です。

【追記】
安藤と青菜さんは同一の方ですよね?
名前の統一をお願いします。

Re: このプログラムで割り込みが起こっている部分はどこなのでしょうか。

Posted: 2012年12月12日(水) 20:24
by 青菜
回答ありがとうございました。とても参考になりました。
softya(ソフト屋) さんが書きました: 【追記】
安藤と青菜さんは同一の方ですよね?
名前の統一をお願いします。
青菜です。
何といいますか、安藤さんから聞かれた問題が恥ずかしながらわからなかったので安藤さんから
ここでいろいろ教えていただけると聞いてお互いのPCでごっちゃに質問を繰り返しているうちに混ざってしまったようです。
以後、安藤に統一します。
失礼しました。

Re: このプログラムで割り込みが起こっている部分はどこなのでしょうか。

Posted: 2012年12月12日(水) 20:39
by softya(ソフト屋)
ご学友という事なら違う名前で問題ないですから違う名前でご質問ください。

なお、解決した場合は投稿時に解決チェックをお願いします。

Re: このプログラムで割り込みが起こっている部分はどこなのでしょうか。

Posted: 2012年12月13日(木) 12:23
by 青菜
softya(ソフト屋) さんが書きました:ご学友という事なら違う名前で問題ないですから違う名前でご質問ください。

なお、解決した場合は投稿時に解決チェックをお願いします。
わかりました。
いろいろ教えていただきありがとうございました。