web-dev-qa-db-ja.com

Cでnanosleep()を使用するには? 「tim.tv_sec」と「tim.tv_nsec」とは何ですか?

次のtim.tv_sectim.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;
}
71
pnizzle

0.5秒は500,000,000ナノ秒なので、コードは次のようになります。

tim.tv_sec  = 0;
tim.tv_nsec = 500000000L;

現状では、コードは1.0000005秒(1秒+ 500 ns)スリープしています。

71
NPE

tv_nsecは、ナノ秒単位のスリープ時間です。 500000us = 500000000nsなので、次のようにします。

nanosleep((const struct timespec[]){{0, 500000000L}}, NULL);
52
Dave

500000マイクロ秒は500000000ナノ秒です。 500 ns = 0.5 µsだけ待つだけです。

11
glglgl

私は通常、いくつかの#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);
7
E.T

これは私のために働いた....

#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;
}
6
Sunny Shukla

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));
}
0