Большинство помнило розыгрыш, который я когда-либо устраивал на других, было два года, в то время как я учился.
Записал a su
обертка, которая попросила бы пароль пользователя и спрятала бы их в записываемый файл для меня и затем продолжилась бы к нормальному su
. В конце у меня был бы весь набор пароля пользователя в сети и используемый, чтобы так или иначе дразнить их с тем, что пароль пользователя отошлет к символическому сообщению их, что я знаю об их паролях. Это была забава хотя :-))
Я развернул cgi сценарий на http экземпляре, который будет скрытый, собрать пароль пользователя, говоря, что аутентификация системой, и они счастливо совместно использовали бы свои пароли к cgi сценарию, который сохранит их в текстовом файле.
Имел хорошую забаву, оба связанные с обманом пароля. Я не поощрил бы это теперь. Поскольку я нахожусь теперь в обуви Системного администратора и строго не обескураживаю людей, совместно использующих их пароли даже в сети. Если сомнительный, свяжитесь с SysAdm для законности сайта в локальной сети.
Посмотрите время (7), и страницы справочника, на которые оно ссылается. Выборка:
High-Resolution Timers
Before Linux 2.6.21, the accuracy of timer and sleep system calls (see
below) was also limited by the size of the jiffy.
Since Linux 2.6.21, Linux supports high-resolution timers (HRTs),
optionally configurable via CONFIG_HIGH_RES_TIMERS. On a system that
supports HRTs, the accuracy of sleep and timer system calls is no
longer constrained by the jiffy, but instead can be as accurate as the
hardware allows (microsecond accuracy is typical of modern hardware).
You can determine whether high-resolution timers are supported by
checking the resolution returned by a call to clock_getres(2) or look‐
ing at the "resolution" entries in /proc/timer_list.
HRTs are not supported on all hardware architectures. (Support is pro‐
vided on x86, arm, and powerpc, among others.)
Комментарий предполагает, что Вы не можете спать меньше, чем миг. Это неправильно; с HRTs Вы можете. Попробуйте эту программу:
/* test_hrt.c */
#include <time.h>
main()
{
struct timespec ts;
int i;
ts.tv_sec = 0;
ts.tv_nsec = 500000; /* 0.5 milliseconds */
for (i = 0; i < 1000; i++) {
clock_nanosleep(CLOCK_MONOTONIC, 0, &ts, NULL);
}
}
Скомпилируйте его:
$ gcc -o test_hrt test_hrt.c -lrt
Выполнение это:
$ time ./test_hrt
real 0m0.598s
user 0m0.008s
sys 0m0.016s
Как Вы видите, 1 000 повторений 0,5 задержек миллисекунды заняли всего немногим более, чем 0,5 секунды, как ожидалось. Если clock_nanosleep
действительно ожидали до следующего мига перед возвратом потребуется по крайней мере 4 секунды.
Теперь исходный вопрос был, что происходит, если Ваша программа была запланирована в течение того времени? И ответ - то, что это зависит от приоритета. Даже если другая программа будет запланирована, в то время как Ваша программа работает, если Ваша программа будет более высоким приоритетом, или планировщик решает, что это - время Вашей программы для выполнения, то это начнет выполняться снова после clock_nanosleep
возвраты тайм-аута. Это не должно ожидать до следующего мига этого для случая. Можно попытаться выполнить тестовую программу выше при выполнении другого программного обеспечения, которое берет ЦП, и Вы будете видеть, что это все еще выполняется за то же количество времени, особенно при увеличении приоритета с, например.
$ time sudo schedtool -R -p 99 -e ./test_hrt
Если Вы не выполняете ядро в реальном времени, я не использовал бы времена сна <10 мс так или иначе tbh. Даже если планировщик будет готов предвосхитить другой процесс для Вашего тайм-аута, то дрожание будет, вероятно, доминировать над Вашими фактическими временами сна.
Сводка: избегайте таких маленьких интервалов, если у Вас нет ядра в реальном времени. Если Вы не можете изменить ядро, Ваш лучший выбор может состоять в том, чтобы прикрепить Ваш процесс к специализированному ЦП с SCHED_FIFO и активным ожиданием (или сделать другую полезную работу) для чего-то меньшего чем приблизительно двух мига.
Так или иначе сводка закончилась дольше, чем оригинал..., о, хорошо.