在ANSI C中从OpenSSL接收输出的另一种方法

时间:2012-07-17 01:32:50

标签: c pointers openssl exec

这是一项家庭作业,所以我不会分享我的代码。我只允许进行“铅笔下降”讨论。我认为这就是他所说的,所以基本上只是一个讨论。我不是在寻找代码专家。

在我的程序中,我多次fork并使用dgst execlp openssl,它返回一个MD5哈希(?)。我正在使用此字符串来比较多个文件,看它们是否相同。

目前,我发现从中获取输出的唯一方法是使用-out并将其保存到文件中,但一遍又一遍地执行此操作不会附加文件,它只是重写文件所以这样做是一个缓慢而痛苦的过程。

我问是否有一种方法可以通过exec或openssl将这个输出字符串写入父指针然后可以从那里访问和操作的指针,这样我就不会写入文件并通过父文件读取,一次一个过程。

1 个答案:

答案 0 :(得分:1)

fork之前,您可以使用pipe创建一对单向文件描述符(一个用于读取,一个用于写入)。在fork之后,您可以使用dup2将该子进程的管道的写入结束设置为输出文件描述符,然后exec。然后,当父级从管道的读取端读取时,它将读取子进程正在写入stdout的内容。

由于您要比较多个子进程的输出,因此每个子进程都应拥有自己的管道。

int fd[2];
pipe(fd);
pid_t pid = fork();
if (pid == 0) {
    close(fd[0]);
    dup2(fd[1], 1);
    execlp(/*...*/);
} else if (pid > 0) {
    close(fd[1]);
    while (read(fd[0], /*...*/) > 0) {
        /* ... */
    }
    wait4(&pid, /*...*/);
}
/* ... */

这只是您需要使用的调用的模型。您的代码必须处理从多个管道读取。