2010-01-04 3 views
1

У меня есть приложение, которое создает очередь заданий, а затем несколько потоков выполняют задания. Выполняя их, я имею в виду, что они называют 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

Вместо того чтобы использовать систему() .. можно использовать popen(). Затем читайте с вывода каждого ребенка в родительской программе и выполняйте с ним то, что вы хотите (например, синхронизируйте на каком-то мьютексе при выводе каждой строки).

0

Как указывает pnm, popen(), вероятно, лучший способ пойти. Вам все равно нужно хранить все, что вы читаете по трубе, и в конце пишите его туда, где вы планируете сохранить его, не вставляя его в вывод других вызовов popen().

Уродливый, менее эффективный, но, возможно, более простой способ - настроить свои системные() задания для перенаправления их вывода на файлы. Затем вы можете получить поток, который получает имена файлов после завершения вызовов system(), который добавляет содержимое файла целиком к вашему выводу и удаляет временные файлы.

Или какой-то другой вариант. Используйте popen(), сохраните результаты работы канала, которые читаются где-то в памяти, передайте адрес памяти в выходной поток при завершении всплывающих вызовов и т. Д.

0

Кроме того, что написано pnm и Duck, вы должны проверить страницу руководства для программы externel, и проверить, как они позволяют вам подавлять ненужный вывод.

И в крайнем случае вы можете подавлять выход через оболочку, например.

system("flac ... > /dev/null"); или даже стандартный вывод и стандартный поток ошибок: system("flac ... 2>&1");

0

Я думаю POPEN() является лучшим решением, но это может занять какую-то работу.

Возможно, быстрое решение может перенаправить вывод каждого приложения в файл tmp.
Затем, как только все потоки закончены, скопируйте файлы tmp в стандартный вывод.

system("plop > tmp1"); 
Смежные вопросы