Cでnanosleep()を使用するには? 「tim.tv_sec」と「tim.tv_nsec」とは何ですか?
次のtim.tv_sec
とtim.tv_nsec
の使用法は何ですか?
500000
マイクロ秒の間実行をスリープ状態にするにはどうすればよいですか?
#include <stdio.h>
#include <time.h>
int main()
{
struct timespec tim, tim2;
tim.tv_sec = 1;
tim.tv_nsec = 500;
if(nanosleep(&tim , &tim2) < 0 )
{
printf("Nano sleep system call failed \n");
return -1;
}
printf("Nano sleep successfull \n");
return 0;
}
0.5秒は500,000,000ナノ秒なので、コードは次のようになります。
tim.tv_sec = 0;
tim.tv_nsec = 500000000L;
現状では、コードは1.0000005秒(1秒+ 500 ns)スリープしています。
tv_nsec
は、ナノ秒単位のスリープ時間です。 500000us = 500000000nsなので、次のようにします。
nanosleep((const struct timespec[]){{0, 500000000L}}, NULL);
500000マイクロ秒は500000000ナノ秒です。 500 ns = 0.5 µsだけ待つだけです。
私は通常、いくつかの#defineと定数を使用して計算を簡単にします。
#define NANO_SECOND_MULTIPLIER 1000000 // 1 millisecond = 1,000,000 Nanoseconds
const long INTERVAL_MS = 500 * NANO_SECOND_MULTIPLIER;
したがって、私のコードは次のようになります。
timespec sleepValue = {0};
sleepValue.tv_nsec = INTERVAL_MS;
nanosleep(&sleepValue, NULL);
これは私のために働いた....
#include <stdio.h>
#include <time.h> /* Needed for struct timespec */
int nsleep(long miliseconds)
{
struct timespec req, rem;
if(miliseconds > 999)
{
req.tv_sec = (int)(miliseconds / 1000); /* Must be Non-Negative */
req.tv_nsec = (miliseconds - ((long)req.tv_sec * 1000)) * 1000000; /* Must be in range of 0 to 999999999 */
}
else
{
req.tv_sec = 0; /* Must be Non-Negative */
req.tv_nsec = miliseconds * 1000000; /* Must be in range of 0 to 999999999 */
}
return nanosleep(&req , &rem);
}
int main()
{
int ret = nsleep(2500);
printf("sleep result %d\n",ret);
return 0;
}
POSIX 7
最初に関数を見つけます: http://pubs.opengroup.org/onlinepubs/9699919799/functions/nanosleep.html
これには time.h
へのリンクが含まれており、ヘッダーとして構造体が定義されているはずです。
ヘッダーはtimespec構造を宣言するものとします。この構造には、少なくとも次のメンバーが含まれます。
time_t tv_sec Seconds. long tv_nsec Nanoseconds.
man 2 nanosleep
常にsyscallをチェックする必要がある疑似公式glibcドキュメント:
struct timespec {
time_t tv_sec; /* seconds */
long tv_nsec; /* nanoseconds */
};
より正しいバリアント:
{
struct timespec delta = {5 /*secs*/, 135 /*nanosecs*/};
while (nanosleep(&delta, &delta));
}