Перенаправление вывода cmd-скрипта в файл
как вариант, используется буферизированный вывод, при этом файл не закрывается
Т.е. похоже, что приложение завершилось аварийно?
Т.е. похоже, что приложение завершилось аварийно?оно завершилось штатно, вот только буфер в памяти остался, и на винт не был сброшен.
И ты думаешь, что в библиотеке C могут не сбрасываться буферы printf при штатном завершении программы?
И ты думаешь, что в библиотеке C могут не сбрасываться буферы printf при штатном завершении программы?запросто. деструкторов же нет.
соответственно если нет fclose, то либа и не узнает о том, что вообще что-то завершается.
mainCRTStartup я думаю, довольно интеллектуален для этого, нет?
но так - это лишь гипотеза. похожие проблемы с буферизацией (не гарантирую, что именно в С) наблюдал несколько раз собственными глазами.
Да и в этом случае полечить было бы неплохо.
mainCRTStartup я думаю, довольно интеллектуален для этого, нет?скорее как раз нет
mainCrtStartup - это виндовая функция, которая про C-шные либы ничего не знает
про либы должна знать main
mainCrtStartup должна использоваться в тех случаях когда не хочется тащить(запускать) с-шную либу с собой
зы
тоже самое, что функции CreateThread и beginthread
mainCrtStartup - это виндовая функция, которая про C-шные либы ничего не знаетлол, это не виндовая функция. Это как раз функция поддержки библиотеки С. В ней вызываются инициализаторы глобальных переменных и конструкторы/деструкторы глобальных объектов.
Почему бы ей не отвечать за буферы printf?
Хотя сейчас посмотрю.
mainCrtStartup должна использоваться в тех случаях когда не хочется тащить(запускать) с-шную либу с собойэто вообще чушь несусветная
Хотя посмотреть будет сложновато, эти штучки могут регистрироваться через какой-нибудь atexit
Это как раз функция поддержки библиотеки С. В ней вызываются инициализаторы глобальных переменных и конструкторы/деструкторы глобальных объектов.так ты реализуешь main или mainCrtStartup?
если второе, то как раз - стандартное поведение mainCrtStartup вызываться не будет.
и соответственно, все что ты перечислил происходить не будет.
это вообще чушь несусветнаяпервая же ссылка гугла подтверждает мои ощущения, и в статье - mainCrtStartup используется именно для того, что я упоминул выше.
http://www.codeproject.com/KB/library/tlibc.aspx?display=Pri...
mainCRTStartup
Where does your console program start? Did I hear you say main? If you did, you said what I would have said before journeying into the inner Stationworkings of the C Runtime.
Windows isn't nice enough to provide your app with a ready-made argc and argv. All it does is call a void function specified in the EXE header. And by default, that function is called mainCRTStartup. Here is a simple example:
extern "C" void __cdecl mainCRTStartup
{
int argc = _init_args;
_init_atexit;
_initterm(__xc_a, __xc_z); // Call C++ constructors
int ret = main(argc, _argv, 0); // Don't handle environment strings
_doexit;
ExitProcess(ret);
}
так ты реализуешь main или mainCrtStartup?Ну откуда вообще такие мысли? Я где-то писал, что "реализую" mainCRTStartup? Что вообще значит "реализовать mainCRTStartup" по-твоему? Кто этим занимается?
первая же ссылка гугла подтверждает мои ощущения, и в статье - mainCrtStartup используется именно для того, что я упоминул выше.Ты продолжаешь. mainCRTStartup — это и есть часть стандартной сишной либы, которую как ты говоришь "не хочется тащить" ну что за бред?
Ты продолжаешь. mainCRTStartup — это и есть часть стандартной сишной либы, которую как ты говоришь "не хочется тащить" ну что за бред?ты статью читал?
Ну откуда вообще такие мысли? Я где-то писал, что "реализую" mainCRTStartup? Что вообще значит "реализовать mainCRTStartup" по-твоему? Кто этим занимается?извращенцы всякие, коих в этом форуме, каждый первый.
Но я и до этой статьи сталкивался с этой твоей mainCRTStartup и на ассемблере писал программы. И знаю, что такое точка входа в приложение. И знаю, что если ты используешь библиотеку С (которая не нужна в ассемблерной программе то в твою прогу статически влинковывется часть, где написана функция mainCRTStartup, которая и является точкой входа, ее цель — запустить main, передать ей нормальные параметры, выполнить инициализацию, получить от main код завершения, выполнить деинициализацию, вернуть код завершения системе.
В твоей статье чуваки написали свою точку входа и чтобы запутать тебя, назвали ее так же. В принципе, имели право, потому что это тоже C-RunTime Startup, но это вводит в заблуждение. Тебя ввело.
В твоей статье чуваки написали свою точку входа и чтобы запутать тебя, назвали ее так же. В принципе, имели право, потому что это тоже C-RunTime Startup, но это вводит в заблуждение. Тебя ввело.насколько я понимаю они это сделали не просто так, а для того, чтобы меньше надо было бодаться с компилятором (там конечно можно сменить entrypoint, но это лишние телодвижения)
зы
признаю, что не точно сформулировал.
эта точка входа стандартная для микрософтовского компилятора, а не для винды в целом.
В этом mainCRTStartup (в CRT Microsoft ) ничего связанного с буфером непосредственно не нашел, но это может регистрироваться в atexit.
Но посуди сам: ты в каждой программе, которая что-то выводит в stdout перед завершением сбрасываешь буферы? Ведь нет? Вот и мне кажется, что там либо аварийное завершение, либо
А хотя какой atexit? Это должно быть явно прописано. Надо пройтись отладчиком, он вроде может заходить во все деинициализаторы. Завтра займусь.
Но посуди сам: ты в каждой программе, которая что-то выводит в stdout перед завершением сбрасываешь буферы? Ведь нет? Вот и мне кажется, что там либо аварийное завершение, либопри аварийном завершении тоже должны сброситься
но вот при task kill не смогут
Посмотри первый пост, там весь скрипт пошел дальше работать нормально, а вывод исчез _задолго_ до завершения работы программы. Что-то мистическое.
а вывод исчез _задолго_ до завершения работы программы. Что-то мистическое.может тупо память запоролась, а по случайному совпадению - это память оказалась, которая отвечает за вывод.
a = b + c;
assert( a == b + c );
assert( b == a - c );
А, кстати, чуть не забыл. Дело происходило на VmWare Server
Я не буду писать код типаэто достаточное условие, чтобы не было порчи памяти? )
Ну я как бы о том, что порча памяти — это жесть, это невозможно, я не верю
Ну я как бы о том, что порча памяти — это жесть, это невозможно, я не верюв преобразовании картинки запросто - т.к. координаты точки часто формируются по длинной цепочке, и поэтому легко вылететь за реальные размеры.
А, понял. Блин. Я о другой порче. Ну это да, это стремно.
На сколько я знаю, когда вывод происходит на экран, то буфер сбрасывается после '\n'.
Но при выводе в файл этого не происходит, но по идее должно сбрасываться при выходе
из программы, если она не завершается аварийно. В любом случае должна помочь функция
fflush( FILE* stream) после каждого вывода. Если выводишь по printf, то писать надо fflush( stdout).
Сорри, почитал тему, похоже, что я сегодня сыграл в КО)
А эксперимент можно воспроизвести опять?
Но на это нужно время.
Да и по другим причинам этот "эксперимент" в любом случае придется воспроизводить еще очень много раз
Никаких у меня ебаных мыслей (c)
Оставить комментарий
Serab
Ситуация следующая.Написан небольшой cmd-скрипт по типу следующего:
Запустил его на ночь следующим образом:
Сегодня пришел посмотреть.
В логах примерно следующее:
Так вот там файлов было не 4. И все они по факту были обработаны. Но следов сообщений об этом в выходном файле нету. Все эти сообщения выводились через printf/wprintf.
Вот такие вот дела.
Есть идеи, почему вывод мог оказаться обрезанным? Вывода там довольно много, как минимум 3 умножить на 30 таких файлов.