控制多线程应用程序中对输出的访问

时间:2010-01-04 00:12:38

标签: c++ boost multithreading boost-thread

我有一个创建作业队列的应用程序,然后多个线程执行作业。通过执行它们,我的意思是他们用作业字符串调用system()。

问题是输出到stdout看起来像问题底部的输出。我希望每个应用程序运行分离,因此输出看起来像:

flac 1.2.1 ...
...
...

flac 1.2.1 ...
...
...

etc.

我正在使用我无法控制的程序,因此无法将IO包装在互斥锁中。

如何让输出看起来像上面那样?

ffllaacc  11..22..11,,  CCooppyyrriigghhtt  ((CC)) 2000,2001,2002, 2003,220004,2
005,0200,0260,0210,0270 0 2J,o2s0h0 3C,o2a004,2005,2l0s0o6n,
007f l aJco scho mCeosa lwsiotnh
 AfBl
OcL UcfTolEmaLecYs   1Nw.Oi2t .hW1 A,AR BRCSAoONpLTyUYrT.iE gL hYTt h Ni(OsC  )W
i AsR2 R0fA0rN0eT,eY2 .0s 0o 1fT,th2wi0as0r 2ei,,s2  0af0nr3de, e2y 0os0uo4 f,at
2rw0ea0
e,,2 0wa0en6ld,c 2oy0mo0eu7   ta orJ eor
hd iCswotearllicsbooumnte
 tiotf  lruaencdd iecsrot mrceiesbr utwtaieit nhi  tcA oBunSndOdiLetUriT oEcnLes
Yr. t Na OiT nyW pAceRo Rn`AdfNilTtaYic.o' n  sfT.oh ri  sTd yeiptsea  if`lrfsel
.ea
s
'f tfwor adreet,a iandl sy.ou
a
e
welcome to redistribute it under certain conditions.  Type `flac' for details.

4 个答案:

答案 0 :(得分:4)

您可以使用popen()而不是使用system().. 然后,从父程序中的每个子输出中读取,并使用它执行所需的操作(例如,在输出每一行时在某些互斥锁上同步)。

答案 1 :(得分:0)

正如pnm指出的那样,popen()可能是最好的选择。您仍然必须存储通过管道读取的所有内容,并在最后将其写入您计划保留的任何位置,而不会将其与其他popen()调用的输出交叉。

一个更丑陋,效率更低但可能更简单的方法是设置system()作业以将其输出重定向到文件。然后,您可以在system()调用complete之后获得一个传递文件名的线程,该线程将文件内容完整地附加到您的输出并删除临时文件。

或两者的某些变体。使用popen(),将管道的结果存储在内存中的某处,当popen调用完成时将内存地址传递给输出线程等。

答案 2 :(得分:0)

除了pnm和Duck所写的内容之外,您应该查看外部程序的手册页,并检查它们如何允许您抑制不必要的输出。

最后,你可以通过shell来抑制输出,例如

system("flac ... > /dev/null");甚至是stdout和stderr:system("flac ... 2>&1");

答案 3 :(得分:0)

我认为popen()是最好的解决方案,但可能需要一些工作。

我快速解决方案可能是将每个应用程序的输出重定向到tmp文件 然后,一旦完成所有线程,就将tmp文件复制到标准输出。

system("plop > tmp1");