私はちょっと奇妙な問題を抱えています。私は、標準入力から取得したデータをネット経由でこのプログラムの別のインスタンスに送信することになっている単純なプログラムに取り組んでいました。このプログラムは、データを直接標準出力に送信する必要があります。しかし、データの一部だけを送信するだけで、期待どおりに機能しませんでした。その後、stdin からの読み取りで問題がどこにあるかを突き止めることができました。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define SIZE 1024
int main(void) {
char *buffer;
int read_bytes;
buffer = (char *) malloc(sizeof(char)*SIZE);
while ((read_bytes = read(STDIN_FILENO,buffer,SIZE)) == SIZE) {
write(STDOUT_FILENO,buffer,SIZE);
fprintf(stderr,"read %d bytes\n",read_bytes);
}
fprintf(stderr,"read %d bytes\n",read_bytes);
write(STDOUT_FILENO,buffer,read_bytes);
return 0;
}
(これは、元のコードの実際の部分ではなく、単に問題を説明するためのものです)
より多くの時間がかかるものから調達するまで、すべて正常に機能します(->標準入力から標準出力へのデータの再送信)。たとえば:
find / | ./the_programme > output.file
数千バイト後に出力が停止しましたが、その理由が本当にわかりません (完全に終了していませんでした)。fcntl で STDIN_FILENO の O_NONBLOCK フラグをクリアしようとしましたが、まったく役に立ちませんでした。私はおそらくここでひどく基本的な何かを見逃していますが、マニュアルページもグーグルも役に立ちませんでした.