Многие знают, что sleep() обладает плохой точностью. Многие так же знают, что sleep(), как и любой блокирующий системный вызов нужно вызывать в цикле, так как он попросту может не выждать требуемое от него количество времени.
Но в таком случае, после обработки сигнала, когда управляющий поток вернётся в место, где его прервали, sleep() будет вызван с теми же параметрами, что и первый раз.

Возможно, Вы думаете, что можно положиться на то, что sleep() возвращает время, которое ему нужно "доспать" и просто итерировать цикл, до тех пор, пока возвращаемое значение не будет равно 0. Давайте обратимся к документации библиотеки libc.

Resist the temptation to implement a sleep for a fixed amount of time by using the return value of sleep, when nonzero, to call sleep again. This will work with a certain amount of accuracy as long as signals arrive infrequently. But each signal can cause the eventual wakeup time to be off by an additional second or so. Suppose a few signals happen to arrive in rapid succession by bad luck—there is no limit on how much this could shorten or lengthen the wait.
Тоесть, разработчики стандартной библиотеки C настоятельно рекомендуют воздерживаться от такого кода:

  1. int n = 1;
  2. while (n>0) {
  3.  n = sleep(n);
  4. }
Потому, что жизненный путь программы может пролегать через ситуации, когда процессу будет приходить любое количество сигналов, любых типов, в любой последовательности и в ходе прерывания слипа однажды, может совершенно спокойно пропасть или добавиться секунда или больше (или меньше). Особенно это касается сигнала SIGALRM. На некоторых системах, даже если Вы перехватили, заблокировали этот сигнал, sleep() может закончиться раньше. И это не полный список проблем.

Все эти проблемы можно решить разными способами, но есть один вариант, который покрывает их всех вместе. Используйте nanosleep(). Если механизм обработки сигналов прервёт выполнение этого вызова -- он вернёт -1 и errno будет установлена в значение EINTR. А факт того, что, она запишет оставшееся время ожидания в наносекундах в структуру timespec, указатель на которую можно передать вторым аргументом, позволит корректно продолжить "сон".

  1. #include <errno.h>
  2. #include <time.h>
  3.  
  4. int sleep_ex( unsigned long sleep_time_sec )
  5. {
  6.         struct timespec tv;
  7.         /* Construct the timespec from the number of whole seconds... */
  8.         tv.tv_sec = sleep_time_sec;
  9.         /* ... and the remainder in nanoseconds. */
  10.         tv.tv_nsec = static_cast < long > ( ( sleep_time_sec - tv.tv_sec )  * 1000000000  );
  11.  
  12.         int rval = 0;
  13.  
  14.         // repeat nanosleep() call only if rval == -1 and errno set to EINTR
  15.         do {
  16.                 /* Sleep for the time specified in tv. If interrupted by a
  17.                  signal, place the remaining time left to sleep back into tv. */
  18.                 rval = nanosleep ( &tv, &tv );
  19.         } while ( rval == -1 && errno == EINTR );
  20.  
  21.         return rval;
  22. }


Нет аватара

Георгий 23 Мая в 18:49 #

Привет! В твоём тёплом и уютном бложике комментарии приветствуются? Или здесь больше "мысли в слух"?

Нет аватара

JamesCup 11 Февраля в 14:53 #

buy viagra for less tadalafil 25mg generic viagra wholesale viagra legal buy ok take 150mg viagra buy viagra now online receita medica comprar viagracheap viagra sale onlinecaverject and viagra togethercialis 5 mg costo farmaciabuying cialis in canadacostco viagra pricescialis generico guadalajara jaliscoviagra de 25mg ou 50mgviagra to buy in canadacialis 5 mg is it enoughwhere to buy cialis over the counter

Нет аватара

JamesCup 11 Февраля в 14:53 #

buy viagra for less tadalafil 25mg generic viagra wholesale viagra legal buy ok take 150mg viagra buy viagra now online receita medica comprar viagracheap viagra sale onlinecaverject and viagra togethercialis 5 mg costo farmaciabuying cialis in canadacostco viagra pricescialis generico guadalajara jaliscoviagra de 25mg ou 50mgviagra to buy in canadacialis 5 mg is it enoughwhere to buy cialis over the counter

Нет аватара

BvsdGrino 18 Июня в 23:55 #

cialis pills - genericcialisvzmonline.com/ cialis pills buy cialis ’

Нет аватара

BvsdGrino 18 Июня в 23:55 #

cialis pills - genericcialisvzmonline.com/ cialis pills buy cialis ’

Нет аватара

lucindadk11 13 Июля в 00:11 #

Novel project travel.tobuy.in/?dispatch.mercedes auto erotic asphyxiation erotic hotels erotic novels authors star wars erotic gay sex

Нет аватара

lucindadk11 13 Июля в 00:11 #

Novel project travel.tobuy.in/?dispatch.mercedes auto erotic asphyxiation erotic hotels erotic novels authors star wars erotic gay sex

Нет аватара

LouisSop 21 Июля в 08:16 #

bg6e1.scornfully.co/ ofh4l.talebearer.co/ 19dhop.scornfully.co/ 4v50z.diacritical.co/ ac239.diacritical.co/ 15icxj.scornfully.co/ 11oxad.talebearer.co/ 17m86v.diacritical.co/ vbqmr.scornfully.co/ 14ag51.talebearer.co/ 1saei.diacritical.co/ q6p1j.talebearer.co/ 20b1y.talebearer.co/ ithwg.talebearer.co/ yr7hx.talebearer.co/ oo8q8.talebearer.co/ 5cwzf.diacritical.co/ zqsi6.talebearer.co/ 16n95m.diacritical.co/ iqwtd.diacritical.co/ ax09.diacritical.co/ 9uouv.scornfully.co/ 8lzpy.talebearer.co/ 18bus5.diacritical.co/ 19fpnb.scornfully.co/ v9fh2.scornfully.co/ 16ozd.talebearer.co/ i1wra.scornfully.co/ 14u2nb.diacritical.co/ 111dev.diacritical.co/ x49ej.diacritical.co/ i6nrx.scornfully.co/ 18kwki.talebearer.co/ k0xba.diacritical.co/ zu9h3.scornfully.co/ pv7f6.talebearer.co/ zzern.talebearer.co/ lw1up.talebearer.co/ 33zs8.diacritical.co/ p99b0.diacritical.co/ uljro.scornfully.co/ 7e18a.diacritical.co/ iksy2.scornfully.co/ vnusb.diacritical.co/ 1aqr98.diacritical.co/ sf9jq.scornfully.co/ knd9z.scornfully.co/ 7a0rb.diacritical.co/ l73wd.diacritical.co/ 90tb2.diacritical.co/ d7zex.diacritical.co/ ngkql.diacritical.co/ q14sm.talebearer.co/ d8t7q.talebearer.co/ 12cpmq.diacritical.co/ rf1o3.talebearer.co/ 18d49b.talebearer.co/ nc68m.scornfully.co/ f5o5s.scornfully.co/ 15rrca.diacritical.co/ 2s993.diacritical.co/ hisj2.talebearer.co/ zh6s7.scornfully.co/ l8d6a.diacritical.co/ uwst5.diacritical.co/ xjuj3.diacritical.co/ oeikv.scornfully.co/ 19epef.scornfully.co/ 48z83.diacritical.co/ 23pjx.talebearer.co/ 7j5aw.diacritical.co/ dojvy.talebearer.co/ q3ae.diacritical.co/ mkc4x.talebearer.co/ 16cwwb.diacritical.co/ 13hn6s.talebearer.co/ 39nhu.talebearer.co/ pba4d.diacritical.co/ 12fblm.scornfully.co/ vvuvk.talebearer.co/ l99ib.diacritical.co/ rsafy.talebearer.co/ vscbq.talebearer.co/ uhgi5.talebearer.co/ xnysz.diacritical.co/ 10g4xn.scornfully.co/ 3l4z8.talebearer.co/ gcsn2.talebearer.co/ 113o8y.talebearer.co/ qc194.scornfully.co/ 19d64f.diacritical.co/ cwvqk.talebearer.co/ 6l45x.talebearer.co/ zlrna.talebearer.co/ haq46.scornfully.co/ 4u10u.scornfully.co/ 117f4r.scornfully.co/ yq7p8.scornfully.co/ hbv5n.scornfully.co/ c7qwh.scornfully.co/ 13iw0k.diacritical.co/ 15mkci.diacritical.co/ hxfzn.talebearer.co/ cpiu9.scornfully.co/ 19ii41.diacritical.co/ l0ztt.talebearer.co/ il8c0.scornfully.co/ 19wdsa.diacritical.co/ 18xzld.talebearer.co/ 9lpjg.talebearer.co/ 1hozs.talebearer.co/ 1aukql.scornfully.co/ xl6c9.talebearer.co/ n8scf.talebearer.co/ 6xkga.scornfully.co/ uh301.diacritical.co/ ai75h.scornfully.co/ b5r8k.diacritical.co/ 186udh.scornfully.co/ q095s.scornfully.co/ 13ea03.talebearer.co/ acsae.scornfully.co/ 1kngg.diacritical.co/ etnkw.scornfully.co/ bhrth.diacritical.co/ 18b40h.talebearer.co/ n197l.scornfully.co/ 1ajzg8.diacritical.co/ lvfvq.talebearer.co/ oz4.talebearer.co/ awgk4.diacritical.co/ jugat.scornfully.co/ 5zzhm.diacritical.co/ zvlea.scornfully.co/ 91hmq.talebearer.co/ dhspp.scornfully.co/ 4qg4c.talebearer.co/ 9hspq.scornfully.co/ r7enr.diacritical.co/ 13m4q7.talebearer.co/ b7avj.talebearer.co/ 2a5fo.scornfully.co/ 6dxei.diacritical.co/ 7rttt.talebearer.co/ dgebk.diacritical.co/ mfgn7.scornfully.co/ wllwj.diacritical.co/ 18rdm.talebearer.co/ m8g9c.talebearer.co/ ds0jc.scornfully.co/ 16696r.talebearer.co/ 5dgmg.diacritical.co/ 8152g.diacritical.co/ fhzfz.scornfully.co/ 10u4et.scornfully.co/ 13uzt5.talebearer.co/ 63t5k.scornfully.co/ h36yc.diacritical.co/ m2k75.diacritical.co/ 10et4i.scornfully.co/ 170lgg.talebearer.co/ 1aju83.scornfully.co/ 59y1x.diacritical.co/ t1fx5.scornfully.co/ a8qjq.diacritical.co/ bkw7f.talebearer.co/ nkbb3.scornfully.co/ hbmg6.scornfully.co/ 7gmzy.scornfully.co/ kmsbo.diacritical.co/ p4fyq.talebearer.co/ oqcra.scornfully.co/ 4wdrf.scornfully.co/ 1539jk.scornfully.co/ gqszy.diacritical.co/ vn895.diacritical.co/ prmsa.talebearer.co/ jy4uk.scornfully.co/ 103w3h.diacritical.co/ 4nosc.diacritical.co/ 12j6n7.diacritical.co/ qdqbt.scornfully.co/ qm5df.scornfully.co/ 14dcxh.talebearer.co/ ltw8r.talebearer.co/ d5m0x.talebearer.co/ 5lx1y.diacritical.co/ 109pt0.diacritical.co/ db3sw.diacritical.co/ 13waum.talebearer.co/ 1arnl8.diacritical.co/ thr9s.talebearer.co/ a3oy2.talebearer.co/ pyctt.talebearer.co/ 11y5mu.diacritical.co/ 1kbj7.talebearer.co/ ujy8w.scornfully.co/ 15v15n.scornfully.co/ vh09q.talebearer.co/ haq46.scornfully.co/ rwwo.floorwalker.us/ o4s4.prosecution.us/ 1vqc.subjection.us/ ysnk.proscription.us/ zpic.scoundrelly.us/

Нет аватара

LouisSop 21 Июля в 08:16 #

bg6e1.scornfully.co/ ofh4l.talebearer.co/ 19dhop.scornfully.co/ 4v50z.diacritical.co/ ac239.diacritical.co/ 15icxj.scornfully.co/ 11oxad.talebearer.co/ 17m86v.diacritical.co/ vbqmr.scornfully.co/ 14ag51.talebearer.co/ 1saei.diacritical.co/ q6p1j.talebearer.co/ 20b1y.talebearer.co/ ithwg.talebearer.co/ yr7hx.talebearer.co/ oo8q8.talebearer.co/ 5cwzf.diacritical.co/ zqsi6.talebearer.co/ 16n95m.diacritical.co/ iqwtd.diacritical.co/ ax09.diacritical.co/ 9uouv.scornfully.co/ 8lzpy.talebearer.co/ 18bus5.diacritical.co/ 19fpnb.scornfully.co/ v9fh2.scornfully.co/ 16ozd.talebearer.co/ i1wra.scornfully.co/ 14u2nb.diacritical.co/ 111dev.diacritical.co/ x49ej.diacritical.co/ i6nrx.scornfully.co/ 18kwki.talebearer.co/ k0xba.diacritical.co/ zu9h3.scornfully.co/ pv7f6.talebearer.co/ zzern.talebearer.co/ lw1up.talebearer.co/ 33zs8.diacritical.co/ p99b0.diacritical.co/ uljro.scornfully.co/ 7e18a.diacritical.co/ iksy2.scornfully.co/ vnusb.diacritical.co/ 1aqr98.diacritical.co/ sf9jq.scornfully.co/ knd9z.scornfully.co/ 7a0rb.diacritical.co/ l73wd.diacritical.co/ 90tb2.diacritical.co/ d7zex.diacritical.co/ ngkql.diacritical.co/ q14sm.talebearer.co/ d8t7q.talebearer.co/ 12cpmq.diacritical.co/ rf1o3.talebearer.co/ 18d49b.talebearer.co/ nc68m.scornfully.co/ f5o5s.scornfully.co/ 15rrca.diacritical.co/ 2s993.diacritical.co/ hisj2.talebearer.co/ zh6s7.scornfully.co/ l8d6a.diacritical.co/ uwst5.diacritical.co/ xjuj3.diacritical.co/ oeikv.scornfully.co/ 19epef.scornfully.co/ 48z83.diacritical.co/ 23pjx.talebearer.co/ 7j5aw.diacritical.co/ dojvy.talebearer.co/ q3ae.diacritical.co/ mkc4x.talebearer.co/ 16cwwb.diacritical.co/ 13hn6s.talebearer.co/ 39nhu.talebearer.co/ pba4d.diacritical.co/ 12fblm.scornfully.co/ vvuvk.talebearer.co/ l99ib.diacritical.co/ rsafy.talebearer.co/ vscbq.talebearer.co/ uhgi5.talebearer.co/ xnysz.diacritical.co/ 10g4xn.scornfully.co/ 3l4z8.talebearer.co/ gcsn2.talebearer.co/ 113o8y.talebearer.co/ qc194.scornfully.co/ 19d64f.diacritical.co/ cwvqk.talebearer.co/ 6l45x.talebearer.co/ zlrna.talebearer.co/ haq46.scornfully.co/ 4u10u.scornfully.co/ 117f4r.scornfully.co/ yq7p8.scornfully.co/ hbv5n.scornfully.co/ c7qwh.scornfully.co/ 13iw0k.diacritical.co/ 15mkci.diacritical.co/ hxfzn.talebearer.co/ cpiu9.scornfully.co/ 19ii41.diacritical.co/ l0ztt.talebearer.co/ il8c0.scornfully.co/ 19wdsa.diacritical.co/ 18xzld.talebearer.co/ 9lpjg.talebearer.co/ 1hozs.talebearer.co/ 1aukql.scornfully.co/ xl6c9.talebearer.co/ n8scf.talebearer.co/ 6xkga.scornfully.co/ uh301.diacritical.co/ ai75h.scornfully.co/ b5r8k.diacritical.co/ 186udh.scornfully.co/ q095s.scornfully.co/ 13ea03.talebearer.co/ acsae.scornfully.co/ 1kngg.diacritical.co/ etnkw.scornfully.co/ bhrth.diacritical.co/ 18b40h.talebearer.co/ n197l.scornfully.co/ 1ajzg8.diacritical.co/ lvfvq.talebearer.co/ oz4.talebearer.co/ awgk4.diacritical.co/ jugat.scornfully.co/ 5zzhm.diacritical.co/ zvlea.scornfully.co/ 91hmq.talebearer.co/ dhspp.scornfully.co/ 4qg4c.talebearer.co/ 9hspq.scornfully.co/ r7enr.diacritical.co/ 13m4q7.talebearer.co/ b7avj.talebearer.co/ 2a5fo.scornfully.co/ 6dxei.diacritical.co/ 7rttt.talebearer.co/ dgebk.diacritical.co/ mfgn7.scornfully.co/ wllwj.diacritical.co/ 18rdm.talebearer.co/ m8g9c.talebearer.co/ ds0jc.scornfully.co/ 16696r.talebearer.co/ 5dgmg.diacritical.co/ 8152g.diacritical.co/ fhzfz.scornfully.co/ 10u4et.scornfully.co/ 13uzt5.talebearer.co/ 63t5k.scornfully.co/ h36yc.diacritical.co/ m2k75.diacritical.co/ 10et4i.scornfully.co/ 170lgg.talebearer.co/ 1aju83.scornfully.co/ 59y1x.diacritical.co/ t1fx5.scornfully.co/ a8qjq.diacritical.co/ bkw7f.talebearer.co/ nkbb3.scornfully.co/ hbmg6.scornfully.co/ 7gmzy.scornfully.co/ kmsbo.diacritical.co/ p4fyq.talebearer.co/ oqcra.scornfully.co/ 4wdrf.scornfully.co/ 1539jk.scornfully.co/ gqszy.diacritical.co/ vn895.diacritical.co/ prmsa.talebearer.co/ jy4uk.scornfully.co/ 103w3h.diacritical.co/ 4nosc.diacritical.co/ 12j6n7.diacritical.co/ qdqbt.scornfully.co/ qm5df.scornfully.co/ 14dcxh.talebearer.co/ ltw8r.talebearer.co/ d5m0x.talebearer.co/ 5lx1y.diacritical.co/ 109pt0.diacritical.co/ db3sw.diacritical.co/ 13waum.talebearer.co/ 1arnl8.diacritical.co/ thr9s.talebearer.co/ a3oy2.talebearer.co/ pyctt.talebearer.co/ 11y5mu.diacritical.co/ 1kbj7.talebearer.co/ ujy8w.scornfully.co/ 15v15n.scornfully.co/ vh09q.talebearer.co/ haq46.scornfully.co/ rwwo.floorwalker.us/ o4s4.prosecution.us/ 1vqc.subjection.us/ ysnk.proscription.us/ zpic.scoundrelly.us/


Войдите или зарегистрируйтесь, чтобы написать комментарий.