将进程的输出写入缓冲区

6 浏览
0 Comments

将进程的输出写入缓冲区

在我的C++程序中,我使用execv/system运行外部程序。

我想将程序的输出重定向到我的程序的缓冲区中,即:

char* buff[足够大以容纳任何可能的输出大小];
system(某个程序);
//我刚刚运行的程序是一个特殊的黑盒程序,它运行并解析一个HTTP转储文件,并在运行时将其打印到屏幕上
//我希望输出到我的程序的缓冲区中
//我的想法是将输出的数据存储在缓冲区中而不是文件中
//将缓冲区填充为程序的输出数据

谢谢 🙂

0
0 Comments

在处理子进程的输出时,我们应该使用管道来进行进程间通信。这是因为在POSIX/UNIX/Linux环境中,使用管道是一种非常有效的方式。通过管道,我们可以将子进程的输出直接传递给父进程进行处理。

那么为什么要使用管道来处理子进程的输出呢?原因在于,子进程的输出通常是通过标准输出流(stdout)进行的。如果我们直接读取标准输出流,可能会遇到以下问题:

1. 子进程的输出可能会被其他输出混淆,导致我们无法正确解析子进程的输出。

2. 读取标准输出流的速度可能无法跟上子进程的输出速度,导致数据丢失。

3. 子进程的输出可能过大,无法一次性读取完毕。

为了解决这些问题,我们可以使用管道来进行进程间通信。管道是一种特殊的文件,可以将一个进程的输出直接传递给另一个进程进行处理。通过管道,父进程可以实时地读取子进程的输出,而不会导致数据丢失或混淆。

在这里,我们可以借鉴Stackoverflow上的一个有用的问题/答案,该问题提供了一些关于使用fork()、pipe()和exec()进行进程创建和通信的好资源。你可以在这里找到问题的链接:fork(), pipe() and exec() process creation and communication

通过参考这个问题,我们可以了解到如何正确地使用管道来处理子进程的输出。具体的实现方式和代码可以参考问题中提供的资源。使用管道来处理子进程的输出,可以确保我们能够准确地读取和处理子进程的输出,避免数据丢失或混淆的问题。

0
0 Comments

有时候我们需要将一个进程的输出保存到一个缓冲区中,然后进行进一步的处理或者保存。下面的代码展示了一个实现这个功能的方法:

char* buff[some size large enough for any possible output];
system(some program > somefile.txt);
read(somefile.txt, buff, bufflen);
unlink somefile.txt;

这段代码的目的是将一个程序的输出重定向到一个文件中,并将文件的内容读取到一个缓冲区中。这样做的好处是可以方便地对程序的输出进行处理,而不需要直接操作文件。

需要注意的是,为了确保缓冲区足够大以容纳任何可能的输出,我们需要将`some size large enough for any possible output`替换为一个足够大的值。

另外,我们还可以不将输出写入文件,而是直接将其读取到一个字符串流中,这样就不需要担心缓冲区的大小了。以下是示例代码:

#include 
#include 
int main() {
    std::ostringstream oss;
    system(some program > oss);
    std::string output = oss.str();
    // 对输出进行进一步处理或保存
    return 0;
}

这段代码将程序的输出保存到一个字符串流中,然后可以通过`oss.str()`方法获取字符串流的内容,并进行进一步的处理或保存。

总结起来,将一个进程的输出保存到一个缓冲区中的方法有两种:一种是将输出重定向到文件,然后将文件内容读取到缓冲区中;另一种是将输出保存到字符串流中,然后通过字符串流获取输出的内容。这样可以方便地对程序的输出进行处理或保存。

0