Windows / C ++ fread()停止从另一个进程读取数据

时间:2014-06-14 05:40:52

标签: c++ c windows pipe popen

所以我遇到了一个非常令人沮丧的问题......基本上我试图在两个不同的程序之间传输数据。生产者程序将数据发送到stdout。消费者程序通过_popen()启动生产者然后使用fread()从该进程读取......这最初起作用,但是在可能的15次循环迭代之后,消费者每次都开始读取0个字节(即使生产者应该仍在输出数据。)

我注意到,如果我调整数据速率很多,我就不会遇到这个问题......但是这不是一个真正的选择,因为在真实场景中,数据会是未经压缩的视频通过ffmpeg传输。

这是我的消费者计划:

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

int main() {
    FILE * in = _popen("Pipe.exe", "r");

    if(in == NULL){
        printf("ERROR\n");
        exit(0);
    }

    int stride = 163840;
    char * buffer = (char*)malloc(stride);

    int bytesRead;
    while(true){
        bytesRead = fread(buffer, 1, stride, in);
        printf("%i\n", bytesRead);
        Sleep(10);
    }
}

我的制作人计划:

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

int main() {
    int stride = 163840;
    char * buffer = (char*) malloc(stride);

    char value = 0;
    while(true){
        // This just changes the data for every loop iteration
        for(int i = 0; i < stride; i++){
            buffer[i] = value;
        }

        value = value == 255 ? 0 : value + 1;

        fwrite(buffer, 1, stride, stdout);
        Sleep(10);
    }
}

0 个答案:

没有答案