我正在尝试编写简单的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
并不能满足您的需要,因为它是一个专门的库函数。直接使用系统调用fork
和pipe
。
使用fork
创建子进程,使用pipe
将stdout
重定向回父进程。
有关详细信息,请参见this示例。
顺便说一下,这正是shell在命令它执行此操作时所执行的操作:
cat /home/image.img | md5sum > result