0


私はちょっと奇妙な問題を抱えています。私は、標準入力から取得したデータをネット経由でこのプログラムの別のインスタンスに送信することになっている単純なプログラムに取り組んでいました。このプログラムは、データを直接標準出力に送信する必要があります。しかし、データの一部だけを送信するだけで、期待どおりに機能しませんでした。その後、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 フラグをクリアしようとしましたが、まったく役に立ちませんでした。私はおそらくここでひどく基本的な何かを見逃していますが、マニュアルページもグーグルも役に立ちませんでした.

4

1 に答える 1

8

マニュアルから ( man 2 read):

戻り値:

成功すると、読み取られたバイト数が返され (ゼロはファイルの終わりを示します)、ファイル位置はこの数値だけ進められます。この数が要求されたバイト数よりも小さい場合、エラーにはなりません。これは、たとえば、現在実際に使用できるバイト数が少ないため (おそらく、ファイルの終わりに近づいていたため、またはパイプまたは端末から読み取っているため)、または read() が a によって中断されたために発生する可能性があります。信号。

while ((read_bytes = read(STDIN_FILENO,buffer,SIZE)) > 0) {
    write(STDOUT_FILENO,buffer,read_bytes);
    fprintf(stderr,"read %d bytes\n",read_bytes);
}
于 2012-08-25T22:48:08.963 に答える