シリアルポートとGPIOポートを両方使用したプログラムを作成しました。read関数を使用した部分でブロッキングI/Oが原因となりGPIOポートが利用できなくなるという問題が起きました。
この問題自体はノンブロッキングI/Oの設定を行うことで解決できたのですが、以下の疑問が残りました。
・なぜI/O処理をブロックする必要があるのか
・ブロッキングI/OとノンブロッキングI/Oはどのように使い分けるのか
・ブロッキングI/Oという機能は何故出来たのか
I/Oポートの制限を行わない方がプログラムを作成しやすいと思うのですが、なぜread関数などは初期状態がブロッキングする状態になっているのでしょう。
No.1ベストアンサー
- 回答日時:
>・なぜI/O処理をブロックする必要があるのか
「ノンブロッキング」はデータの受信(送信)完了を待たずに次の処理に移行することができる。
逆にいえば、受信データがそろわないうちに処理を行う為、データ欠損による問題が発生する場合があります。
もしくは、処理途中で次のデータを受信しバッファの上書きの可能性もあります。
>・ブロッキングI/OとノンブロッキングI/Oはどのように使い分けるのか
H/W特性、データ内容、それに付随する処理内容によって決定する。
>・ブロッキングI/Oという機能は何故出来たのか
前述の通り。
「なぜ」というよりも「なければ困る」から。
>I/Oポートの制限を行わない方がプログラムを作成しやすいと思うのですが、
「プログラムを作成しやすい」というのは間違いです。
それは「H/W特性」を理解せずにプログラムを作成していることに他なりません。
read「関数」はあくまでも「データを入力する」という抽象的な機能しか持っていません。
その先(入力I/F)が何かは理解できません。これを理解し適切に処理するのがプログラマーの役割です。
>なぜread関数などは初期状態がブロッキングする状態になっているのでしょう。
データを受信して処理を行っている間は、後発データによる上書きを禁止するため。
ノンブロッキングにした場合データが受信途中のまま次の処理に移行してしまうということになるんですね。
H/W特性やデータ内容を考えた時にはブロッキングの方が良くなることもあるということを考えながらこれからプログラムを作っていきたいと思います。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# LU分解法のピボット選択機能実装について(C言語・gcc-9) 1 2022/07/22 15:20
- その他(プログラミング・Web制作) Pythonでこのプログラミングを作りたいのですが 1 2022/10/24 18:56
- マウス・キーボード キーボード Oキーを押すとプルダウンメニューが出る 4 2022/09/08 14:48
- 英語 Take の感じはどうですか? 4 2022/11/27 04:06
- 英語 英文法の使役構文について質問です。 I know you have got another book 1 2023/02/03 22:07
- その他(プログラミング・Web制作) Pythonでこのプログラミングを作成するには 2 2022/10/25 21:19
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- Visual Basic(VBA) 列と行の名前(重複あり)が交差するセルに、データを入力したい 3 2022/06/12 11:17
- C言語・C++・C# numpyスライス機能を使った数値計算 2 2023/05/08 16:01
- 数学 .(X,O)をコンパクト空間とする.Xの開被覆C={Ui;i∈N}について,任意のi∈Nに対して,U 2 2023/01/17 18:54
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
TCP/IP通信時のサーバーからの受信
-
UDP通信におけるbind関数について
-
ソケットを用いた1対多通信につ...
-
ソケットのrecvの戻り値が0
-
Socket通信の0バイト受信について
-
同じLAN内パソコンのIPアドレス...
-
SIPがNATを越えられない理由
-
recv関数でフリーズしてしまう
-
相手のIPアドレスを取得する方法
-
Winsockで接続待ちタイムアウト...
-
JavaによるXMLの送受信
-
VB6のwinsockでconnectできない
-
エクセル VBA でのCOMポート...
-
ソケット通信 同じポート番号...
-
Socket通信を待ち受け状態にす...
-
送信したデータの一部が文字化...
-
ネットワークプログラミングに...
-
メッセージを受信したら受信終...
-
UDPで受信スループットを測定
-
winsockでファイル転送
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
TCP/IP通信時のサーバーからの受信
-
UDP通信におけるbind関数について
-
Winsockで接続待ちタイムアウト...
-
recv関数でフリーズしてしまう
-
VB6のwinsockでconnectできない
-
ソケットのクローズについて
-
UDP通信する時に、相手にどうや...
-
エクセル VBA でのCOMポート...
-
ソケットのrecvの戻り値が0
-
UdpClient 送信元のIPアドレ...
-
Socket通信の0バイト受信について
-
WinSockでの通信プログラムがう...
-
同じLAN内パソコンのIPアドレス...
-
ソケット通信 同じポート番号...
-
VC++でのソケット通信について
-
Connectエラーが出てしまう・・...
-
CreateFile関数でCOMポートが開...
-
Winsockを使わずにVBでSocketを...
-
VB6‥ソケットについて
-
SIPがNATを越えられない理由
おすすめ情報