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

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

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

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

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Q&A

解決済

1回答

1911閲覧

2バイトのデータをread関数(linux)で2バイト確実に読む方法

NEWBIEEBIEE

総合スコア62

C

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

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

0グッド

1クリップ

投稿2017/01/25 10:13

編集2017/01/25 10:14

linuxのread関数(https://linuxjm.osdn.jp/html/LDP_man-pages/man2/read.2.html)ですが、uint8_tで読み込む際には普通に
read(fd, [uint8_t変数のアドレス],sizeof([uint8_t変数]));で何ら支障がないと思います。
ですが、uint16_tを読む場合,
read(fd, [uint16_t変数のアドレス],sizeof([uint16_t変数]));
だと2バイト読めず1バイトだけを読んで関数が終了することがあると思います。
termiousなどの設定を変更せず、ある変数に確実に2バイトを読みだす方法はございませんでしょうか。よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

こんにちは。

linuxには詳しくはないのでずか、read処理でデータの到着を待たずに終了するような時は、必要なデータを読み終わるまで繰り返しreadを呼び出すのが定石です。
そのような処理系ではreadから返ってきたときに何バイト読み出せているかの値が返却される筈ですので、そのバイト位置以降へ読み出すようread関数へ指示します。

下記イメージです。

C++

1int len=sizeof(変数); 2uint8_t* p=(uint8_t*)&変数; 3for (int pos=0; pos < len ; ) 4{ 5 pos += read(fd, p+pos, len-pos); 6} 7

この場でざざっと書いたので、ミスがあってイメージがうまく伝わらないかも知れません。その時はコメント下さい。

投稿2017/01/25 10:24

Chironian

総合スコア23272

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

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

NEWBIEEBIEE

2017/01/25 10:28

なるほど、わかりました。ありがとうございます。
Chironian

2017/01/25 10:34

すいません。1つ漏れてました。上記ループではread関数を連続して呼び出しますので、もし、バッファにデータが無い時、直ぐに戻ってくる場合、CPU使用率が大きく上がってしまいます。可能であればread関数呼出しにタイムアウトを設定した方が良いです。 タイムアウト設定がどうしても出来ない時は、sleep(0);などでread()処理後にCPUを一旦解放すると多少改善します。ただ、読み落としのリスクがあるわりにCPUの消費も多くあまり好ましい対策ではないです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問