Перенаправление вывода cmd-скрипта в файл
> Есть идеи, почему вывод мог оказаться обрезанным?
как вариант, используется буферизированный вывод, при этом файл не закрывается
как вариант, используется буферизированный вывод, при этом файл не закрывается
Т.е. похоже, что приложение завершилось аварийно?
Т.е. похоже, что приложение завершилось аварийно?оно завершилось штатно, вот только буфер в памяти остался, и на винт не был сброшен.
И ты думаешь, что в библиотеке C могут не сбрасываться буферы printf при штатном завершении программы?
И ты думаешь, что в библиотеке C могут не сбрасываться буферы printf при штатном завершении программы?запросто. деструкторов же нет.
соответственно если нет fclose, то либа и не узнает о том, что вообще что-то завершается.
не fprintf, а printf.
mainCRTStartup я думаю, довольно интеллектуален для этого, нет?
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, но это вводит в заблуждение. Тебя ввело.
Но я и до этой статьи сталкивался с этой твоей mainCRTStartup и на ассемблере писал программы. И знаю, что такое точка входа в приложение. И знаю, что если ты используешь библиотеку С (которая не нужна в ассемблерной программе то в твою прогу статически влинковывется часть, где написана функция mainCRTStartup, которая и является точкой входа, ее цель — запустить main, передать ей нормальные параметры, выполнить инициализацию, получить от main код завершения, выполнить деинициализацию, вернуть код завершения системе.
В твоей статье чуваки написали свою точку входа и чтобы запутать тебя, назвали ее так же. В принципе, имели право, потому что это тоже C-RunTime Startup, но это вводит в заблуждение. Тебя ввело.
В твоей статье чуваки написали свою точку входа и чтобы запутать тебя, назвали ее так же. В принципе, имели право, потому что это тоже C-RunTime Startup, но это вводит в заблуждение. Тебя ввело.насколько я понимаю они это сделали не просто так, а для того, чтобы меньше надо было бодаться с компилятором (там конечно можно сменить entrypoint, но это лишние телодвижения)
зы
признаю, что не точно сформулировал.
эта точка входа стандартная для микрософтовского компилятора, а не для винды в целом.
Ладно, не суть. Проблему не решает. Придется запустить еще раз, чтобы воспроизвести. Надо будет вручную сбрасывать буфер и выводить код завершения на экран, чтобы понять, что там стряслось.
В этом mainCRTStartup (в CRT Microsoft
) ничего связанного с буфером непосредственно не нашел, но это может регистрироваться в atexit.
Но посуди сам: ты в каждой программе, которая что-то выводит в stdout перед завершением сбрасываешь буферы? Ведь нет? Вот и мне кажется, что там либо аварийное завершение, либо
А хотя какой atexit? Это должно быть явно прописано. Надо пройтись отладчиком, он вроде может заходить во все деинициализаторы. Завтра займусь.
В этом mainCRTStartup (в CRT Microsoft
) ничего связанного с буфером непосредственно не нашел, но это может регистрироваться в atexit.Но посуди сам: ты в каждой программе, которая что-то выводит в stdout перед завершением сбрасываешь буферы? Ведь нет? Вот и мне кажется, что там либо аварийное завершение, либо

А хотя какой atexit? Это должно быть явно прописано. Надо пройтись отладчиком, он вроде может заходить во все деинициализаторы. Завтра займусь.
Но посуди сам: ты в каждой программе, которая что-то выводит в stdout перед завершением сбрасываешь буферы? Ведь нет? Вот и мне кажется, что там либо аварийное завершение, либопри аварийном завершении тоже должны сброситься
но вот при task kill не смогут
Ну аварийное аварийному рознь =) При каком-нибудь AV наверняка не сбрасываются.
Посмотри первый пост, там весь скрипт пошел дальше работать нормально, а вывод исчез _задолго_ до завершения работы программы. Что-то мистическое.
Посмотри первый пост, там весь скрипт пошел дальше работать нормально, а вывод исчез _задолго_ до завершения работы программы. Что-то мистическое.
а вывод исчез _задолго_ до завершения работы программы. Что-то мистическое.может тупо память запоролась, а по случайному совпадению - это память оказалась, которая отвечает за вывод.
Не-не-не =) Я не буду писать код типа
А, кстати, чуть не забыл. Дело происходило на VmWare Server
a = b + c;
assert( a == b + c );
assert( b == a - c );
А, кстати, чуть не забыл. Дело происходило на VmWare Server

Я не буду писать код типаэто достаточное условие, чтобы не было порчи памяти? )
Ну я как бы о том, что порча памяти — это жесть, это невозможно, я не верю 

Ну я как бы о том, что порча памяти — это жесть, это невозможно, я не верюв преобразовании картинки запросто - т.к. координаты точки часто формируются по длинной цепочке, и поэтому легко вылететь за реальные размеры.
А, понял. Блин. Я о другой порче. Ну это да, это стремно.
Недавно столкнулся с такой штукой в Linux.
На сколько я знаю, когда вывод происходит на экран, то буфер сбрасывается после '\n'.
Но при выводе в файл этого не происходит, но по идее должно сбрасываться при выходе
из программы, если она не завершается аварийно. В любом случае должна помочь функция
fflush( FILE* stream) после каждого вывода. Если выводишь по printf, то писать надо fflush( stdout).
Сорри, почитал тему, похоже, что я сегодня сыграл в КО)
На сколько я знаю, когда вывод происходит на экран, то буфер сбрасывается после '\n'.
Но при выводе в файл этого не происходит, но по идее должно сбрасываться при выходе
из программы, если она не завершается аварийно. В любом случае должна помочь функция
fflush( FILE* stream) после каждого вывода. Если выводишь по printf, то писать надо fflush( stdout).
Сорри, почитал тему, похоже, что я сегодня сыграл в КО)
А эксперимент можно воспроизвести опять?
Да, я обязательно воспроизведу.
Но на это нужно время.
Да и по другим причинам этот "эксперимент" в любом случае придется воспроизводить еще очень много раз
Но на это нужно время.
Да и по другим причинам этот "эксперимент" в любом случае придется воспроизводить еще очень много раз

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

Никаких у меня ебаных мыслей
(c)Оставить комментарий
Serab
Ситуация следующая.Написан небольшой cmd-скрипт по типу следующего:
Запустил его на ночь следующим образом:
Сегодня пришел посмотреть.
В логах примерно следующее:
Так вот там файлов было не 4. И все они по факту были обработаны. Но следов сообщений об этом в выходном файле нету. Все эти сообщения выводились через printf/wprintf.
Вот такие вот дела.
Есть идеи, почему вывод мог оказаться обрезанным? Вывода там довольно много, как минимум 3 умножить на 30 таких файлов.