gpt4 book ai didi

c++ - ubuntu 服务器管道停止进程在第一次退出时终止

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

情况是:我有一个外部应用程序,所以我没有源代码,也无法更改它。运行时,应用程序将日志写入标准错误。任务是编写一个程序来检查它的输出并将输出的某些部分分离到其他文件。我的解决方案是像这样启动应用程序

./externalApp 2>&1 | myApp

myApp 是一个 c++ 应用程序,来源如下:

using namespace std;

int main ()
{
string str;
ofstream A;
A.open("A.log");

ofstream B;
B.open("B.log");

A << "test start" << endl;

int i = 0;

while (getline(cin,str))
{
if(str.find("asdasd") != string::npos)
{
A << str << endl;
}
else
{
B << str << endl;
}
++i;
}

A << "test end: " << i << " lines" << endl;
A.close();
B.close();

return 0;
}

externalApp 可能会崩溃或被终止。在那一刻,myApp 也被终止了,它不写最后几行,也不关闭文件。该文件可以是 60Gb 或更大,因此保存它并在不是变体之后进行处理。

更正:我的问题是当 externalApp 崩溃时它会终止 myApp。这意味着 while block 之后的任何代码都不会运行。所以问题是:有没有办法在 externalApp 关闭后运行 myApp?

我怎样才能正确地完成这个任务?我对完成此任务的任何其他想法很感兴趣。

最佳答案

显示的代码没有任何问题,您的问题中没有任何证据表明显示的代码有任何问题。没有证据表明您的日志记录应用程序实际上收到了要从该外部应用程序写入的“最后几行”。很可能是外部应用程序在崩溃之前未能将它们写入标准输出或错误。

最可能的解释是您的外部应用程序检查其标准输出或错误是否连接到交互式终端;如果是这样,它的日志消息的每一行后面都会有一个显式的缓冲区刷新。当外部应用程序的标准输出是管道时,不会发生这种刷新,因此日志消息会缓冲起来,并且仅在应用程序的内部输出缓冲区已满时才刷新。这是一种相当普遍的行为。但正因为如此,当外部应用程序崩溃时,它最后记录的行将永远丢失。因为您的记录器从未收到过它们。您的记录器无法对其从未读取的日志行执行任何操作。

在您的情况下,唯一可用的选项是设置伪 tty 设备并将其连接到外部应用程序的标准输出和错误,使其认为已连接到交互式终端,而其输出实际上由您的应用程序捕获.

您不能从 shell 执行此操作。您需要编写一些代码来设置它。您可以从 reading the pty(7) manual page 开始其中解释了要遵循的过程,此时您将获得可以获取的文件描述符,并将其附加到您的外部应用程序。

关于c++ - ubuntu 服务器管道停止进程在第一次退出时终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43129167/

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