我有一个创建作业队列的应用程序,然后多个线程执行作业。通过执行它们,我的意思是他们用作业字符串调用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.
答案 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");