0

我正在尝试编写简单的 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;
}

谢谢

4

2 回答 2

2

popen在这里并没有真正给你你想要的东西,因为它是一个专门的库函数。使用系统调用forkpipe直接代替。

您用于fork创建子进程并pipe重定向stdout回父进程。

有关详细信息,请参阅示例。

顺便说一句,当您命令它执行此操作时,这正是 shell 所做的:

cat /home/image.img | md5sum > result
于 2013-10-09T08:24:39.960 回答
1

谢谢 Henrik,以下是所有想知道如何操作的代码:

int     fd_pipe[2], nbytes, status;
char    pipe_buffer[1000];
memset(pipe_buffer,'\0',1000);

        if(pipe(fd_pipe)!=0)
            {
            perror("fd_pipe:");
            exit(EXIT_FAILURE);
            }
        pid = fork();
        if (pid == -1) 
            {
            perror("Fork failed");
            exit(EXIT_FAILURE);
            }
        else
            {
            if(pid>0) //The parent's part
                {
                // Parent process closes output side of the pipe 
                close(fd_pipe[1]);
                //Parent wait's untill the child is done
                wait(&status);
                // Read in a string from the pipe's input side 
                nbytes = read(fd_pipe[0], pipe_buffer, sizeof(pipe_buffer)); 

                printf("Received %d chars, string: %s \n", nbytes, pipe_buffer);
                                    //on the end close the other side of pipe                   
                                    close(fd_pipe[0]);
                }
            else
                {   // The child's part
                /* Child process closes input side of the pipe */
                close(fd_pipe[0]);
                //redirect the stdout(1) to the fd_pipe and then close the sdtout
                dup2(fd_pipe[1],1); 
                //Do the thing which creates the result message 
                system("/image/"IMAGE_NAME | md5sum");

                //on the end close the other side of pipe 
                close(fd_pipe[1]); 
                exit(0);
                }
            }
于 2013-10-11T11:09:18.193 回答