在linux下如何获取从系统booting时到现在所流失的时间ticks

在有些时候,我们需要获取当前系统的时间ticks,当然我们可以使用 如何使安全使用信号中setitimer来完成自己的心愿,但是看看所要设计的代码,是否觉得它时一种深深的痛呢?我们不禁会问自己,有没有一种方便的方法呢?幸运的是,linux提供了这种函数,它就是:
 #include <sys/times.h>
clock_t times(struct tms *buf);
clock_t就是返回的ticks的值,在一般的linux定义中,它是long的typedef。有了它我们就可以轻松的获取ticks值了,比如unsigned long ticks = (unsigned long) times( NULL );
有的时候,我们对ticks的时间精度感兴趣,那么如何获取它呢?请使用如下方法:
unsigned long HZ = sysconf(  _SC_CLK_TCK  );它返回每秒中的ticks个数。 请不要使用在time.h中的CLK_TICKS,因为它是一个过时的使用方法
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要发送DHCP报文获取DHCP信息,可以使用Linux下的socket编程来实现。具体步骤如下: 1. 创建socket对象,使用raw socket类型。 2. 设置socket属性,包括IP地址、端口号等。 3. 创建DHCP报文,并填充报文字段。 4. 发送DHCP报文。 5. 接收DHCP服务器的响应报文。 6. 解析响应报文,获取DHCP信息。 以下是一个简单的示例代码: ```c++ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #define BUF_SIZE 1024 #define DHCP_PORT 67 #define DHCP_SERVER_PORT 68 typedef struct { uint8_t op; // Message op code / message type. uint8_t htype; // Hardware address type (e.g., '1' = 10mb ethernet). uint8_t hlen; // Hardware address length (e.g., '6' for 10mb ethernet). uint8_t hops; // Client sets to zero, optionally used by relay agents when booting via a relay agent. uint32_t xid; // Transaction ID, a random number chosen by the client, used by the client and server to associate messages and responses between a client and a server. uint16_t secs; // Filled in by client, seconds elapsed since client began address acquisition or renewal process. uint16_t flags; // Broadcast flag. struct in_addr ciaddr; // Client IP address; only filled in if client is in BOUND, RENEW or REBINDING state and can respond to ARP requests. struct in_addr yiaddr; // 'your' (client) IP address. struct in_addr siaddr; // IP address of next server to use in bootstrap; returned in DHCPOFFER, DHCPACK by server. struct in_addr giaddr; // Relay agent IP address, used in booting via a relay agent. uint8_t chaddr[16]; // Client hardware address. char sname[64]; // Optional server host name, null terminated string. char file[128]; // Boot file name, null terminated string; "generic" name or null in DHCPDISCOVER, fully qualified directory-path name in DHCPOFFER. uint32_t magic_cookie; // Fixed value: 0x63825363. uint8_t options[308]; // Optional parameters field. } dhcp_packet; int main(int argc, char* argv[]) { int sockfd; struct sockaddr_in servaddr, cliaddr; char buf[BUF_SIZE]; socklen_t len = sizeof(cliaddr); dhcp_packet packet; // 创建socket对象 sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_UDP); if (sockfd < 0) { perror("socket"); exit(1); } // 设置socket属性 memset(&servaddr, 0, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(DHCP_SERVER_PORT); servaddr.sin_addr.s_addr = htonl(INADDR_ANY); if (bind(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0) { perror("bind"); exit(1); } // 创建DHCP报文 memset(&packet, 0, sizeof(packet)); packet.op = 0x01; // Message type: Boot Request packet.htype = 0x01; // Hardware type: Ethernet packet.hlen = 0x06; // Hardware address length: 6 packet.xid = random(); // Transaction ID packet.magic_cookie = htonl(0x63825363); // DHCP Magic Cookie // DHCP Option 53: DHCP Discover packet.options[0] = 0x35; // Option 53 packet.options[1] = 0x01; // Length packet.options[2] = 0x01; // DHCP Discover // DHCP Option 55: Parameter Request List packet.options[3] = 0x37; // Option 55 packet.options[4] = 0x04; // Length packet.options[5] = 0x01; // Subnet Mask packet.options[6] = 0x03; // Router packet.options[7] = 0x06; // Domain Name Server packet.options[8] = 0x0f; // Domain Name packet.options[9] = 0x2c; // Static Route packet.options[10] = 0xff; // End // 发送DHCP报文 memset(&cliaddr, 0, sizeof(cliaddr)); cliaddr.sin_family = AF_INET; cliaddr.sin_port = htons(DHCP_PORT); cliaddr.sin_addr.s_addr = inet_addr("255.255.255.255"); if (sendto(sockfd, &packet, sizeof(packet), 0, (struct sockaddr*)&cliaddr, sizeof(cliaddr)) < 0) { perror("sendto"); exit(1); } // 接收DHCP服务器的响应报文 memset(buf, 0, sizeof(buf)); if (recvfrom(sockfd, buf, sizeof(buf), 0, (struct sockaddr*)&cliaddr, &len) < 0) { perror("recvfrom"); exit(1); } // 解析响应报文,获取DHCP信息 // ... close(sockfd); return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值