質問: 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バイトを読みだす方法はございませんでしょうか。よろしくお願いします。
回答: こんにちは。 linuxには詳しくはないのでずか、read処理でデータの到着を待たずに終了するような時は、必要なデータを読み終わるまで繰り返しreadを呼び出すのが定石です。 そのような処理系ではreadから返ってきたときに何バイト読み出せているかの値が返却される筈ですので、そのバイト位置以降へ読み出すようread関数へ指示します。 下記イメージです。 ``` int len=sizeof(変数); uint8_t* p=(uint8_t*)&変数; for (int pos=0; pos < len ; ) { pos += read(fd, p+pos, len-pos); } ``` この場でざざっと書いたので、ミスがあってイメージがうまく伝わらないかも知れません。その時はコメント下さい。