相关疑难解决方法(0)

以微秒为单位获取C的时间戳?

如何在C中获得微秒时间戳?

我正在尝试:

struct timeval tv;
gettimeofday(&tv,NULL);
return tv.tv_usec;
Run Code Online (Sandbox Code Playgroud)

但是这会返回一些无意义的值,如果我得到两个时间戳,第二个可以比第一个更小或更大(第二个应该总是更大).是否可以将gettimeofday返回的魔术整数转换为可以实际使用的正常数字?

c time

41
推荐指数
5
解决办法
12万
查看次数

隐式声明函数usleep

gcc (GCC) 4.6.3
c89
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用usleep.但是,我一直收到以下警告:

隐式声明函数usleep

我已经包含了unistd.h头文件.

手册页提到了这个问题.但我不确定我理解它:

usleep():
   Since glibc 2.12:
       _BSD_SOURCE ||
           (_XOPEN_SOURCE >= 500 ||
               _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED) &&
           !(_POSIX_C_SOURCE >= 200809L || _XOPEN_SOURCE >= 700)
   Before glibc 2.12:
       _BSD_SOURCE || _XOPEN_SOURCE >= 500 || _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED
Run Code Online (Sandbox Code Playgroud)

但不确定我对上述内容做了什么?

c usleep

24
推荐指数
4
解决办法
4万
查看次数

如何每1 ms发送一次UDP数据包?

我需要编写一个定期发送UDP数据包的Linux应用程序.理想情况下,频率应为每1 ms,数据包之间的间隔应保持一致.

我试过这样通过普通的套接字来做到这一点:

while(counter < 4294967295)
{
    for (k=0; k<4; k++) //Convert counter value to string
    {
        buf[k]=((unsigned char*)(&counter))[k];
    }
    sn = sendto(sender, &buf, sizeof(buf), 0, (struct sockaddr *)&srv_addr, sizeof(srv_addr)); // Sending UDP segment
    if (sn < 0 ) error("UDP send fail!"); //Error handle
    counter++;

    nanosleep(&delay, NULL); //Sleep
}
Run Code Online (Sandbox Code Playgroud)

在上面的应用程序中,我只用一个计数器值填充UDP数据包,所以我可以在接收器的末端区分它们.

基本上这个代码确实起到了作用,但是存在以下问题:1.频率不够高,受主机性能和其他应用的影响很大.2.数据包间隔不一致,因为有RTC用作参考.但是,如果我尝试进行RTC检查,那使得数据包速率更慢.

我认为应该以更优雅的方式用不同的方法实现我的目标.请提出建议.

c sockets linux udp

6
推荐指数
1
解决办法
4677
查看次数

nanosleep高CPU使用率?

我注意到一个叫做nanosleep的小测试程序在使用比2.6.22更新的内核的Linux机器上运行时显示出CPU使用率的巨大差异.

#include <time.h>
int main (void)
{
    struct timespec sleepTime;
    struct timespec returnTime;
    sleepTime.tv_sec = 0;
    sleepTime.tv_nsec = 1000;
    while (1)
    {
      nanosleep(&sleepTime, &returnTime);
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

(是的,我意识到这个程序什么都不做)

如果我编译它并在openSUSE 10.3机器上运行它(2.6.22.19-0.2-default),程序甚至不显示在"top"生成的进程列表上,向我表明它使用的CPU时间非常少.如果我在openSUSE 11.1机器上运行它(2.6.27.23-0.1-default),top会显示该程序占用40%的CPU时间.在Fedora 9(2.6.25-14.fc9.i686)和Fedora 10上运行也显示了"top"中相同的高CPU使用率.

内核是否有变化影响了这个?

linux sleep cpu-usage linux-kernel

5
推荐指数
2
解决办法
1万
查看次数

标签 统计

c ×3

linux ×2

cpu-usage ×1

linux-kernel ×1

sleep ×1

sockets ×1

time ×1

udp ×1

usleep ×1