Як використовувати nanosleep () в C? Що таке `tim.tv_sec` та` tim.tv_nsec`?


77

Яка користь tim.tv_secі tim.tv_nsecв наступному?

Як я можу заснути виконання протягом 500000мікросекунд?

Відповіді:


74

Половина секунди - це 500 000 000 наносекунд, тому ваш код повинен читати:

У ситуації, що стоїть, ваш код спить 10000005s (1s + 500ns).


2
круто. Ще лише одне запитання. Я тестую це за допомогою gettimeofday () двічі та отримую різницю. Тому я отримав різницю в півсекунди. Але також була дуже мала частка секунди через припущення часу обробки процесора. Як я можу це обчислити і відняти від часу сну. мій час склався так: 0,501033 сек
pnizzle

2
@pnizzle: Чого саме ви сподіваєтесь досягти цим відніманням?
NPE

2
я сподіваюся досягти рівно 0,500000 секунд. Спасибі
pnizzle

4
Більшість таймерів не такі дрібнозернисті. Особливо на багатозадачній машині важко точно спати.
Dave

1
я трохи погуглив і знайшов функціональний годинник () .. Що саме це робить? Чи час використання процесора?
pnizzle

53

tv_nsec- час сну в наносекундах. 500000us = 500000000ns, отже, ви хочете:


2
Що таке "L" наприкінці 500000000L ?
Саханд,

3
Це стосується довгих подвійних. як другий аргумент nanosleep () мають довгий подвійний тип. см stackoverflow.com/questions/1380653 / ...
EsmaeelE

1
Тип другої змінної структури наносона такий long. L використовується для перетворення числа long, тому причина intможе бути замалою для обробки значення. Деякі стандарти безпеки (NASA, MISRA) вимагають вказувати тип номера, якщо число більше 2 ^ 16, щоб уникнути коду помилок.
KamilCuk

12

500000 мікросекунд - це 500000000 наносекунд. Ви чекаєте лише 500 нс = 0,5 мкс.


9

Це спрацювало для мене ....


Отже, це не nsleep (...), а msleep (...)?
morbak

1
Це лише ще один символ, щоб правильно писати мілісекунди.
vwvan

8

Зазвичай я використовую деякі #define та константи, щоб полегшити обчислення:

Звідси мій код буде виглядати так:


3

POSIX 7

Спочатку знайдіть функцію: http://pubs.opengroup.org/onlinepubs/9699919799/functions/nanosleep.html

Це містить посилання на a time.h, який як заголовок повинен знаходитись там, де визначені структури:

Заголовок повинен декларувати структуру часу, яка повинна включати> принаймні такі члени:

людина 2 наносон

Псевдоофіційні документи glibc, які ви завжди повинні перевіряти на наявність системних викликів:


2

Більш правильний варіант:


1
Корект для наносек: -> дельта структури timespec = {5 / * секунд * /, 135 * 1000000 / * наносек * /};
штабелер

135 * 1000 000 -> 135 мікросекунд?
Руслан Р. Лаїшев

135 microsecs ==: 135 000 nanosecs, оскільки друге поле має значення "нсек tv_nsec"
укладальник
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.