Pergunta

Eu tenho um aplicativo que cria uma fila de emprego e, em seguida, vários threads executam os trabalhos. Ao executá -los, quero dizer que eles chamam o System () com a string de trabalho.

O problema é que a saída para o stdout se parece com a saída na parte inferior da pergunta. Eu gostaria que cada aplicativo fosse separado, para que a saída fosse:

flac 1.2.1 ...
...
...

flac 1.2.1 ...
...
...

etc.

Estou usando programas que não tenho controle e, portanto, não posso envolver o IO em mutexes.

Como faço para que a saída pareça com o acima?

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.
Foi útil?

Solução

Em vez de usar o System () .. você poderia usar Popen (). Em seguida, leia a saída de cada criança no programa pai e faça o que quiser com ele (por exemplo, sincronize em algum mutex ao emitir cada linha).

Outras dicas

Como PNM aponta, Popen () é provavelmente o melhor caminho a percorrer. Você ainda precisa armazenar tudo o que lê no tubo e, no final, escrevê -lo para onde planeja mantê -lo sem intercalá -lo com a saída das outras chamadas Popen ().

Uma maneira mais feia, menos eficiente, mas possivelmente mais simples, é configurar seus trabalhos do sistema () para redirecionar sua saída para arquivos. Você pode ter um thread que é passado os nomes de arquivos após as chamadas do sistema () completas, que anexam o conteúdo do arquivo na íntegra à sua saída e exclui os arquivos temporários.

Ou alguma variante de ambos. Use Popen (), armazene os resultados do tubo lê em algum lugar da memória, passe o endereço de memória para o segmento de saída quando o Popen chama completo, etc.

Além do que o PNM e o Duck escreveram, você deve verificar a página do homem para obter os programas externos e verificar como eles permitem suprimir a saída desnecessária.

E em um último recurso, você pode suprimir a saída através do shell, por exemplo,

system("flac ... > /dev/null"); ou até stdout e stderr: system("flac ... 2>&1");

Eu acho que Popen () é a melhor solução, mas pode levar algum trabalho.

Solução rápida pode ser redirecionar a saída de cada aplicativo para um arquivo TMP.
Depois que todos os threads terminarem, copie os arquivos TMP para a saída padrão.

system("plop > tmp1");
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top