我正在尝试编写简单的c函数,这将使我有可能看到从一个流到另一个流的数据传输过程,并将其显示在我的字符LCD上。
我设法传输数据并指出进度,但如何得到管道的结果?
所以基本上我想在c中执行对应于shell命令的操作:

/home/image.img | md5sum > result

我对标准输出有问题。我想得到一个char*结果。
换句话说,md5sum在屏幕上返回一个类似“5193fd9ebfa30bcb914e7af4760deb15”的字符串,但我希望将其获取到char*结果中,以便在函数中进一步使用。
FILE *in_stream, *out_stream;
#define TRANSFER_BLOCK_SIZE 1048576 //one MB
int n=0;
int i=0;
long int input_size=0;
unsigned char buffer[TRANSFER_BLOCK_SIZE];

if((out_stream=popen("md5sum","w"))==NULL)
   {
   perror(output_pipe_name);
   return 1;
   }
if((in_stream=fopen("/home/gregorek/image.img","r"))==NULL)
   {
   perror(input_file_name);
   return 1;
   }
//check total size of the input file
fseek(in_stream,0,SEEK_END);
input_size=(ftell(in_stream)/TRANSFER_BLOCK_SIZE)+1;
fseek(in_stream,0,SEEK_SET);
//
do
    {
    i++;
    memset(buffer,'\0',TRANSFER_BLOCK_SIZE);
    n=fread(buffer,sizeof(unsigned char),TRANSFER_BLOCK_SIZE,in_stream);
    lcd_display(i); //this is my progress indicator
    fwrite(buffer,sizeof(unsigned char),n,out_stream);
    }
while(!feof(in_stream));

fclose(in_stream);
pclose(out_stream);

返回0;
}
谢谢

最佳答案

popen并不能满足您的需要,因为它是一个专门的库函数。直接使用系统调用forkpipe
使用fork创建子进程,使用pipestdout重定向回父进程。
有关详细信息,请参见this示例。
顺便说一下,这正是shell在命令它执行此操作时所执行的操作:

cat /home/image.img | md5sum > result

08-17 00:19