Почему не выводит системное время? Проблема с функцией localtime_s
Помощь в написании контрольных, курсовых и дипломных работ здесь.
Почему таймер медленнее идет нежели системное время?
Написал таймер с милисекундами, а он идет медлее, напорядок! одна секунда на нём набегает за 12.
Почему в файл выводит только последнее время?
import javax.swing.*; import java.awt.event.*; import java.io.File; import java.io.FileWriter;.
Необходимо ввести время и от него отнять системное время,необходимо сделать так Введите часы : 17.
Почему выводит разное время при одинаковых параметрах, но в разных количествах потоков?
Работаю с многопоточностью в C++ с библиотекой
Системное время
Здравствуйте! Проблема такая: У нас в организации своя локальная сеть. Есть некий пользователь.
Системное время
Не могу понять почему возвращает неправильно часы, хотя минуты показывает верно, подскажите в чем.
Только начинаю изучать sql, и вот такое задание нужно сделать. Нужно создать переменную и.
Системное время
Доброго всем дня! Собственно вопрос: Есть ли возможность узнать программным путем, было ли.
Системное время
Ребята, делаю программку дни рождения и хочу, чтоб меня оповещала программа, когда будет тому или.
Системное время и БД
Ребята, привет! Скажите, как решить задачу, у меня есть поле в котором дата рождения человека, мне.
Источник
‘localtime’: This function or variable may be unsafe
и сама ошибка: Ошибка 1 error C4996: ‘localtime’: This function or variable may be unsafe. Consider using localtime_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS.
собственно, рекомендации компилятора я выполнил
Помощь в написании контрольных, курсовых и дипломных работ здесь.
‘localtime’: This function or variable may be unsafe
Вот код time_t t; time(&t); tm * a; a = localtime(&t); и вот на что рагаеться компилятор .
This function or variable may be unsafe
Здорова господа! Скачал визуал студио 2013 премиум и в общем весь старый код пишет с ошибками.
This function or variable may be unsafe
Привет всем, нужна помощь! При компиляции выдает ошибку — «fopen»:This function or variable may be.
Error C4996: ‘gets’: This function or variable may be unsafe
#include «stdafx.h» #include»iostream» #include «cstdio» using namespace std; int main() <.
#include #include #include #include #include.
Ошибка: ‘strcpy’: This function or variable may be unsafe
error C4996: ‘strcpy’: This function or variable may be unsafe. Consider using strcpy_s instead. To.
Warning C4996: ‘strcpy’: This function or variable may be unsafe
написал программу все считает , но выводит ошибку окно как сделать отладку программы? .
Классы: Ток-шоу, Развлекательная передача, Телеканал, СМИ (средство массовой информации).
Источник
[C++] Странная проблема с localtime_r и семафорами
Есть довольно большой проект на C++, в котором ни с того, ни с сего
перестали работать семафоры (используем обертку ACE_Thread_Semaphore).
Долго сидел и искал ошибку. В итоге написал маленький пример на
полстраницы, который демонстрирует проблему:
int main(int argc, char** argv)
<
if(argc > 1)
<
const time_t current_unix_time = ::time(NULL);
assert(current_unix_time != -1);
std::cout tm_year tm_mon tm_mday
tm_hour tm_min tm_sec 1):
krivenok@develop2 13:30:24 /tmp/strange $ ./a.out 1
UNIX time = 1238405487, Local time = 2009-3-30 13:31:27
Before acquiring the semaphore. We must hang here since current value of semaphore is 0.
After acquiring the semaphore. r = -1. Function not implemented
krivenok@develop2 13:31:27 /tmp/strange $
Если в первом случае в выводе strace видим:
write(1, «Before acquiring the semaphore. W». 89Before acquiring the semaphore. We must hang here since current value of semaphore is 0.
) = 89
futex(0x804f750, FUTEX_WAIT, 0, NULL^C
write(1, «Before acquiring the semaphore. W». 89Before acquiring the semaphore. We must hang here since current value of semaphore is 0.
) = 89
futex(0x804f7e8, 0xb7cbb170 /* FUTEX_. */, 0) = -1 ENOSYS (Function not implemented)
write(1, «After acquiring the semaphore. r «. 64After acquiring the semaphore. r = -1. Function not implemented
) = 64
То есть в вызов futex передается мусор.
Есть идеи в чем проблема?
Может я где-то сильно туплю и не вижу очевидного?
Мои эксперименты показывают, что причина проблемы — вызов
функции localtime_r (пробовал и localtime, и gmtime[_r]).
Если ее убрать, что все работает как ожидалось.
Кстати, обнаружилась проблема после обновления glibc
с версии 2.6.1 до 2.8.
Параметры системы:
1) gcc
krivenok@develop2 13:37:34 /tmp/strange $ g++-4.3.2 —version
g++-4.3.2 (GCC) 4.3.2
Copyright (C) 2008 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Источник
‘localtime’: This function or variable may be unsafe
и вот на что рагаеться компилятор
‘localtime’: This function or variable may be unsafe. Consider using localtime_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details
Помощь в написании контрольных, курсовых и дипломных работ здесь.
‘localtime’: This function or variable may be unsafe
студия 13 ругается на функцию time_t t = time(0); tm *lt = localtime(&t); и сама ошибка.
This function or variable may be unsafe
Привет всем, нужна помощь! При компиляции выдает ошибку — «fopen»:This function or variable may be.
This function or variable may be unsafe
Здорова господа! Скачал визуал студио 2013 премиум и в общем весь старый код пишет с ошибками.
Error C4996: ‘gets’: This function or variable may be unsafe
#include «stdafx.h» #include»iostream» #include «cstdio» using namespace std; int main() <.
не могу понять вчем ошибка
Добавлено через 37 секунд
что надо исправить в этом коде ?
как мне эту определить _CRT_SECURE_NO_WARNINGS?
Добавлено через 1 минуту
теперь у меня такие оишбки
Ошибка 1 error C2660: localtime_s: функция не принимает 1 аргументов c:\users\евгений\desktop\consoleapplication1\consoleapplicat ion1\consoleapplication1.cpp 293 1 ConsoleApplication1
2 IntelliSense: значение типа «errno_t» нельзя присвоить сущности типа «tm *» c:\Users\Евгений\Desktop\ConsoleApplication1\ConsoleApplicat ion1\ConsoleApplication1.cpp 293 12 ConsoleApplication1
3 IntelliSense: аргумент типа «time_t *» несовместим с параметром типа «tm *» c:\Users\Евгений\Desktop\ConsoleApplication1\ConsoleApplicat ion1\ConsoleApplication1.cpp 293 26 ConsoleApplication1
4 IntelliSense: слишком мало аргументов в вызове функции c:\Users\Евгений\Desktop\ConsoleApplication1\ConsoleApplicat ion1\ConsoleApplication1.cpp 293 28 ConsoleApplication1
Источник
Почему может зависнуть вызов localtime()?
Есть такая замечательная софтина xrdp. И есть в ней такой замечательный код логгирования:
Так вот, ИНОГДА, при неизвестных обстоятельствах, когда одновременно открывается много сессий, вызов now = localtime(&now_t); наглухо зависает. При этом bt в gdb показывает следующее:
Из-за чего это может быть (сразу скажу, что код в этом месте не многопоточный, хотя форкается куча процессов)?
Система — Ubuntu 14.04. xrdp — 0.9 из git master.
Ну ты же для очистки совести попробовал поменять на localtime_r ?
Ещё нет) Я ничего лучше не придумал, чем первым же делом написать сюда. А тыкать пальцем в небо тоже не хочется.
Ну это дело + секунд 😉
Так баг то плавающий. Он то есть, то нет. Я сейчас поменяю, он пропадет, а потом окажется, что это была случайность.
Потом, интересно понять что это за лок такой и почему на нём всё зависает.
Я мельком взглянул на код tzset.c, я не силён в сорцах glibc, но похоже, там лок на глобальный статический обьект в шарной либе.
После форка, адресное пространство хоть и cow, однако дескрипторы остаются все те же как и права на них. Поэтому это вполне может быть dead lock на этом «мьютексе».
Вообщем попробуй воспроизвести раз 10. Посчитай сколько попыток затратил. А потом на том же конфиге попробуй воспроизвести с localtime_r, за то же количество попыток.
Может патч пришлёшь этим негодникам использующим небезопасное дрвенее уг.
В любом случае, в любом свежем софте лучше использовать localtime_r 🙂
И ты, конечно же, не нагуглил это ?
Вообще, там довольно много багов по __tz_convert deadlock .
А не пробовал смотреть ulimit в момент зависания? Может где-то что-то исчерпалось?
Да, понятно, что там как минимум не будет обращения к коду tzset — уже хорошо.
Ну, там уже некий патлатый тип в процессе же 🙂
Вообще не знал что это known issue. Про лок — знал, про смертельный не знал. В своё время, что бы не спать на таком локе (из соображений производительности) была запиленна либа, которая так то сию проблему решает, т.к. лока там нет в принципе 🙂
Конкретно это нагуглил. Но там же ничего нет про дедлок, только про какие-то издержки, которые меня в данном случае не интересуют.
Ну, там уже некий патлатый тип в процессе же 🙂
Не. Он просто хочет набрать сумму в 3000$ за этот баг.
Вот нормальное объяснение, откуда там deadlock.
А. А так всего 100$ цена вопроса?
Там же по ссылке есть workaroud — localtime_safe(). Если баг будет вылазить слишком часто, то можно и заюзать. Или бери либу от
But the state of all mutexes, condvars and other objects are copied
into the child process «as is» and should be reinitialized
Дык и я об чём. Прост выражаюсь кривовато.
Есть даже служебные коллбэки которые можно глобально процессу выставить, что бы дёргались в процессе форка. Вот этот тип. На одной из лекций рассказывает как ими пользоваться.
Честно говоря, не совсем убедительное объяснение:
gmtime_r() is not an async-signal-safe function, and therefore should not be called after a fork in a multithreaded application.
Дело в том, что fork-то есть, но не в multithreaded application.
— ничего не говорит про fork().
Вот тебе кейс когда случается смертельный запор:
пусть стейт мьютекса просто флаг 1/0.
- Полез в localtime
- Поспал пока Мьютекс == 1
- Мьютекс = 1
- Форк из другого потока
- Родитель: сделал дело Мьютекс = 0
- Ребёнок: полез в localtime .
Под localtime, тут подходит любая функция использующая базу данных таймзон в памяти.
Получается, что по этой логике, если я заменю localtime на localtime_r, я рискую наступить на те же грабли с примитивами синхронизации.
Тобишь — достаточно что бы форк произошёл из другого потока. Может быть есть ещё варианты, но тут я не уверен. Притом, нашалившим многопоточным родителем может быть как bash так и твой терминал.
Дело в том, что fork-то есть, но не в multithreaded application.
Там futex’ы и я не знаю, раздваиваются ли как-то они при форке или нет.
thread-safe ещё не значит, что можно вызывать после форка.
Получается что так, хм. Но тут лучше посмотреть сорцы, может там глобальный стейт не захватывается, или захватывается но другой или захватывается на запись только очень редко.
localtime_r() не поможет, tm-буфер отдельно лежит и на синхронизацию никак не влияет, это не его защищают (time/localtime.c в glibc).
Ну пусть тогда переводит проект на libdt 😀 Только как fallback там всё равно используется localtime_r, однако, если перед этим вычислить локальную таймзону, то локов — не будет, заработает праведная реализация.
Альтернатива — пускать из init’a убедившись перед этим, что он однопоточен, а лучше — что не использует glibc 🙂
Не получится. xrdp-sessman форкает сам себя по много раз.
Как сказать. В musl похожее поведение, все эти локи из-за TZ, который может быть изменен из разных потоков, и перед тем как, собственно, конвертировать время оно делает tzset() который и есть корень всех зол, в данном случае.
Вообще, учитывая что это просто логи — Я б забил и просто не вызывал localtime() а просто выводил текущие время как обычный unix time.
Ну он же — однопоточный.
Значит кто-то из родителей оплошал.
Так проблема в том, что связи такого рода не видно. Если нет потоков, то на момент форка лок освобождён. А ядерных объектов то и нету (futex что-то хранит, но только на время вызова). Т.е. у ребёнка всё своё и он не должен никак пересекаться по синхронизации с родителем. Но вообще в коде там есть и потоки, может они просто завершились.
Кстати, это же один поток в дочернем процессе, а проблема в потоках родительского процесса на момент вызова fork().
Да-да, и это делает всю картину гораздо печальнее. Потому что в том же log_message есть вызовы, например, syslog, а эта функция тоже не async-safe. С другой стороны, если заставить fork() (гипотетически) клонировать и все потоки тоже, то не факт, что сам xrdp будет правильно при этом работать. В общем, пока не понятно что делать.
Вообще они вон выпилили поток, но может ещё есть.
Это devel- ветка, то есть, вроде как, нестабильная, а я смотрю в master. Там, вроде как, sessman у них тоже однопоточный, но есть там такой вот чудесный кусок в main():
То есть thread_sighandler_start(); они, всё же, решили не использовать, потому что наступили на какие-то грабли, зато вовсю используют свой log_message из обработчиков сигналов, того же sig_sesman_session_end() например. И в итоге хоть код и не многопоточный, эффекты с примитивами синхронизации могут быть теми же. Удивительно как из самих сигналов всё не лочится.
Интересно, можно ли что-нибудь сделать с log_message(), чтобы оно стало безопасно?
Интересно, можно ли что-нибудь сделать с log_message(), чтобы оно стало безопасно?
Просто удалить вызов localtime(), не?
Да, но что делать с вызовом syslog()?
Страдать, вот, например, еще один баг.
А если серьезно — то или выкинуть его тоже, или сделать свою localtime() и подгружать её.
Кстати, сами же сигналы можно заблокировать, либо пользовать signalfd , который будет работать в текущем потоке, и не будет прерывать выполнение программы.
Если потоки завершились — то соответсвенно и локи они освободили (если говорить конкретно про этот набор функций).
А вот если, например, навороченный мега терминал ТС имеет свой лог, с таймштампами, в отдельном потоке то тут уже могут наблюдаться свистопляски. А если он пускает её из какого нить unity, то вероятность что подобное поведение имеет место быть =>99.99% 🙂
А может, он просто терминал вызвал в неудачное время.
Единственное что меня смущает во всех этих умозаключениях — проблема воспроизводится нестабильно. Но если пускается из гуя то это только подтверждает теории выше.
exec() все побочные эффекты должен убирать. Тут проблема именно в том, что сам xrdp-sesman себя форкает по нескольку раз.
вообще, логирование откуда попало (в том числе с вызовами функций работы с датами) — плохая идея. очереди сообщений и отдельный обработчик на высер всего накопленного в логи и т.д.
А мне-то всегда казалось, что как раз именно логгеры должны быть реализованы таким образом, чтобы их можно было безопасно дергать откуда угодно. Ведь они нужны для диагностики проблем, а не для создания новых)
ну, для обычного приложения это так. но стоит хоть чуть-чуть отойти от массового программирования в сторону чего-то более замысловатого, и сразу уже приходится работать вручную. вообще, мы во всех проектах свои логгеры делали. это не так затратно, зато надёжно. а уж куда потом срать из лога — дело десятое. впрочем, можешь попробовать форкнуть syslog и решить проблему в корне 🙂 я думаю, у них тоже были какие-то тараканы на этот счёт, раз они не стали обеспечивать абсолютную безопасность вызовов.
зато вовсю используют свой log_message из обработчиков сигналов
В этом, я так понимаю и есть главный фейл разработчиков этой программы.
Интересно, что я при этом ни разу не видел зависания в каком-нибудь обработчике сигнала. Но, видимо, так и есть.
тоже сталкивался с такой хренью, прога была без потоков вообще, но тем неменее случайно как то по рандому висло на localtime, разбираться было лень, вставил localtime_r зависания ушли, перечитав весь топик подумаю уйти на localtime_safe, только хз что делать с таймзоной, она тоже нужна мне в некоторых функционалах
Там должно быть в доке к функциям записанно кто reentrant а кто нет. Алгебра и снятие времени там точно глобального записываемого стейта не несёт, если несёт — это бага.
Источник