Проблема с перенаправлением вывода программы - PullRequest
0 голосов
/ 24 марта 2011

Я должен поместить следующую команду в аргумент системной функции в программе на Си.

$ timed-run 20 prog1 1 1>/dev/null 2>abc.dat

timed-run должен выполнить prog1 до 20 секунд, а затем завершить ее.Я хочу, чтобы вывод prog1 был перенаправлен на abc.dat.Есть ли какое-то решение для этого?

Спасибо

Ответы [ 3 ]

1 голос
/ 24 марта 2011

Для перенаправления вывода дочернего процесса есть несколько способов, следующие 2 являются наиболее важными:

  1. popen () (простой для понимания и использования, но popen работает только с stdout дочерних, но вы также можете перенаправить stderr на stdout, добавив строку командной строки "2> & 1")
  2. pipe fork и exec trio помогут вам (в интернете много информации об этих функциях)
1 голос
/ 25 марта 2011

Я подозреваю, что, не увидев исходный код prog1, я не могу понять, что prog1 не очищает свои выходные буферы.То есть он имеет код, который выглядит следующим образом:

i = 42;
fprintf(stderr, "result: %d\n", i);

Отформатированный вывод (т. Е. "Result: 42 \ n") сохраняется в выходном буфере stderr, ожидая записи подходящего момента.,Но, прежде чем это произойдет, timed-run убивает prog1 сигналом.

Вы можете либо периодически вызывать fflush(stderr), либо менять тип буферизации (с помощью setbuf или setvbuf),или поймайте сигнал и позвоните fflush(stderr) при завершении программы.

1 голос
/ 24 марта 2011

Когда вы пишете «1> / dev / null», вы перенаправляете вывод программы в битовую корзину. (То есть вы отбрасываете его.) Если вместо этого вы напишите «1> имя файла», выходные данные перейдут в указанный файл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...