gpt4 book ai didi

c - fopen() 流到 popen() 以获取进度条/控件 - 但如何获取 popen() 的标准输出?

转载 作者:太空宇宙 更新时间:2023-11-04 07:24:40 28 4
gpt4 key购买 nike

我正在尝试编写简单的 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 执行此操作时 shell 执行的操作:

cat /home/image.img | md5sum > result

关于c - fopen() 流到 popen() 以获取进度条/控件 - 但如何获取 popen() 的标准输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19266565/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com