Вы можете сделать это в следующих шагах:
- Переименуйте основную функцию окаменелости во что-то другое, чтобы ее можно было назвать
- Перед вызовом главного ископаемого, перенаправьте stdout / stderr в файл по вашему выбору с помощью:
freopen("filename.out", "w", stdout);
- Сформируйте массив аргументов, вызовите fossil_main, прочитайте вывод из файлов.
- Вам необходимо восстановить состояние потока stdout; для этого нет кроссплатформенного механизма, но вы можете использовать некоторые псевдо-дескрипторы (например, CONOUT $ в Windows).
Тем не менее, обратите внимание, что это хрупкое:
- Могут быть глобальные переменные, которые должны быть инициализированы нулями в начале main (), что не будет истинно для второго вызова main ()
- Ископаемое может изменить состояние какого-либо процесса / потока (локаль, текущий каталог и т. Д.), Вы не сможете его надежно восстановить. Особенно плохим случаем этого является вызов exit (n).
- Не будет обычной очистки при завершении процесса - ожидайте, что дескрипторы файлов остаются открытыми (чтобы вы не смогли открыть их снова, если они открыты без общего доступа), утечки памяти и т. Д.
- Очевидно, что теперь с сбоями / зависаниями в окаменелости будет труднее справляться (иногда вы можете обойти это)
Как правило, вы можете сделать это, но не делайте этого, если у вас нет веских оснований (т.е. для производительности), и вы не готовы к последствиям и исправлению ошибок самостоятельно.