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

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

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

#1

投稿記事 by 青菜 » 13年前

以下のプログラムで内部割り込みが起こっているのはどこなのでしょうか。システムコールを呼び出す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));
	}
}


アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

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

#2

投稿記事 by softya(ソフト屋) » 13年前

環境が書かれていないので何処で内部割り込み・外部割り込みが起こるかはC言語の実装によりますが、OS任せだとそんな事を意識する必要もないと思います。

あえて書くなら
入出力は、外部割り込みが関連する可能性が高いでしょう。
OSのコールは、入出力やexitやmain終了後に発生します。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

青菜

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

#3

投稿記事 by 青菜 » 13年前

失礼しました、割り込みが起こっているところではなく、各々の割り込みを"呼び出す"部分でした。
環境はよくわかりません。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

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

#4

投稿記事 by softya(ソフト屋) » 13年前

青菜 さんが書きました:失礼しました、割り込みが起こっているところではなく、各々の割り込みを"呼び出す"部分でした。
環境はよくわかりません。
環境を限定しないとこの話は、割り込み自体を想定できません。
マイコンなどでOSなしで動いている場合と、パソコンで動いている場合では動作がかなり違うからです。
あと、どのぐらいの知識があるかとか、どのぐらいの深さの話をしたいのか限定する必要もあります。
OSのスーパーバイザレベルとか、システムコールとかどの程度理解されていますか?
分かっているCPUやOSを説明してもらったほうが良いです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

青菜

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

#5

投稿記事 by 青菜 » 13年前

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

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

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

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

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

#6

投稿記事 by softya(ソフト屋) » 13年前

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

あえて書くなら
入出力は、外部割り込みが関連する可能性が高いでしょう。
OSのコールは、入出力やexitやmain終了後に発生します。
軽く説明するなら、上に書いたとおりです。
もう少し細かく書けば、入出力の関数は外部割り込みと内部割り込みが発生する可能性があります。
ただし、OSによって管理されているので実際には外部割り込みは直接は発生しません。
OSに対してのシステムコール(内部割り込み)はexit()やmain終了後となります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

beatle
記事: 1281
登録日時: 14年前
住所: 埼玉
連絡を取る:

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

#7

投稿記事 by beatle » 13年前

僕が知ってる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: このプログラムで割り込みが起こっている部分はどこなのでしょうか。

#8

投稿記事 by 青菜 » 13年前

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

青菜

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

#9

投稿記事 by 青菜 » 13年前

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

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

#10

投稿記事 by softya(ソフト屋) » 13年前

LinuxのC言語の標準関数の中をトレースしたことがないので断言できないことをお断りしておきます。

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

【追記】
安藤と青菜さんは同一の方ですよね?
名前の統一をお願いします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

青菜

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

#11

投稿記事 by 青菜 » 13年前

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

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

#12

投稿記事 by softya(ソフト屋) » 13年前

ご学友という事なら違う名前で問題ないですから違う名前でご質問ください。

なお、解決した場合は投稿時に解決チェックをお願いします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

青菜

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

#13

投稿記事 by 青菜 » 13年前

softya(ソフト屋) さんが書きました:ご学友という事なら違う名前で問題ないですから違う名前でご質問ください。

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

閉鎖

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