简体   繁体   English

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

[英]Controlling access to output in multi-threaded applications

I have an application that creates a job queue, and then multiple threads execute the jobs. 我有一个创建作业队列的应用程序,然后多个线程执行作业。 By execute them, I mean they call system() with the job string. 通过执行它们,我的意思是他们用作业字符串调用system()。

The problem is that output to stdout looks like the output at the bottom of the question. 问题是输出到stdout看起来像问题底部的输出。 I would like each application run to be separated, so the output would look like: 我希望每个应用程序运行分离,因此输出看起来像:

flac 1.2.1 ...
...
...

flac 1.2.1 ...
...
...

etc.

I'm using programs I have no control over, and so cannot wrap the IO in mutexes. 我正在使用我无法控制的程序,因此无法将IO包装在互斥锁中。

How do I get the output to look like the above? 如何让输出看起来像上面那样?

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.

Rather than using system().. you could use popen() . 而不是使用system()..你可以使用popen() Then, read from each child's output in the parent program, and do what you want with it (eg synchronize on some mutex when outputting each line). 然后,从父程序中的每个子输出中读取,并使用它执行所需的操作(例如,在输出每一行时在某些互斥锁上同步)。

As pnm points out, popen() is probably the best way to go. 正如pnm指出的那样,popen()可能是最好的选择。 You still have to store everything you read through the pipe and at the end write it to wherever you plan to keep it without interspersing it with the output of the other popen() calls. 您仍然必须存储通过管道读取的所有内容,并在最后将其写入您计划保留的位置,而不会将其与其他popen()调用的输出交错。

An uglier, less efficient but possibly simpler way is to set up your system() jobs to redirect their output to files. 一个更丑陋,效率更低但可能更简单的方法是设置system()作业以将其输出重定向到文件。 You can then have a thread that gets passed the file names after the system() calls complete which appends the file contents in their entirety to your output and deletes the temporary files. 然后,您可以在system()调用complete之后获得一个传递文件名的线程,该线程将文件内容完整地附加到您的输出并删除临时文件。

Or some variant of both. 或两者的一些变体。 Use popen(), store the results of the pipe reads somewhere in memory, pass the memory address to the output thread when the popen calls complete, etc. 使用popen(),将管道的结果存储在内存中的某处,当popen调用完成时将内存地址传递给输出线程等。

Besides what pnm and Duck wrote, you should check the man page for the externel programs, and check how they allow you to suppress unnecessary output. 除了pnm和Duck所写的内容之外,您还应该查看外部程序的手册页,并检查它们如何允许您抑制不必要的输出。

And on a last resort you may suppress output through the shell, eg 在最后的手段,你可以通过shell抑制输出,例如

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

I think popen() is the best solution, but it may take some work. 我认为popen()是最好的解决方案,但它可能需要一些工作。

I quick solution may be to re-direct the output of each application to a tmp file. 我快速解决方案可能是将每个应用程序的输出重定向到tmp文件。
Then once all the threads are finished copy the tmp files to the standard output. 然后,一旦完成所有线程,就将tmp文件复制到标准输出。

system("plop > tmp1");

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM