C++的系统编程:
可以称之为系统服务(system services)。
系统服务包括与操作系统、硬件、网络等底层资源交互的函数,旨在提供对底层资源的访问和管理,保证应用程序能够正常运行。
系统服务一般包括以下内容:
1. 时间函数:可以获取系统时间、计算时间差、格式化时间等。
2. 线程函数:可以获取当前线程id、线程名称、创建和销毁线程等。
3. 内存管理函数:可以获取当前进程的内存使用情况、分配和释放内存等。
4. 文件和I/O函数:可以读写文件、创建和删除文件、设置文件属性等。
5. 网络函数:可以管理网络连接、套接字、协议等。
上述函数都是C++系统服务中常用的函数,它们提供了对操作系统底层资源的访问和管理,是系统编程所必需的。
如果需要归纳到一类,可以称为系统调用(system calls),表示通过调用系统服务来访问和管理底层资源,
使应用程序能够与操作系统进行交互。
C++中的chrono是时间库,用于实现时间相关的功能,例如计时器、执行时间、日期等。
// C++中可以使用std::chrono来进行时间的操作,其中一个常用的类是std::chrono::system_clock。
// 下面是一个简单的示例程序,用于获取和打印当前时间:
#include <iostream>
#include <chrono>
#include <ctime>
using namespace std;
int main()
{
// 获取当前时间点
std::chrono::system_clock::time_point now = std::chrono::system_clock::now();
// 转换为time_t类型
std::time_t nowTime = std::chrono::system_clock::to_time_t(now);
// 输出当前时间
std::cout << "current time : " << std::ctime(&nowTime);
return 0;
}
// 1. 计时器
// 计时器场景是应用中常见的一种场景,比如需要统计代码执行时间的情况。下面的代码实现了一个简单的计时器。
#include <iostream>
#include <chrono>
#include <thread>
int main()
{
// 获取任务开始的时间点
auto start = std::chrono::high_resolution_clock::now();
// 模拟程序运行一段时间
std::this_thread::sleep_for(std::chrono::seconds(2));
// 获取任务结束的时间点
auto stop = std::chrono::high_resolution_clock::now();
// 获取两个时间点之间的时间差。最后输出了这个时间差,就可以实现一个简单的计时器了。
auto duration = std::chrono::duration_cast<std::chrono::microseconds>(stop - start);
std::cout << "耗时 : " << duration.count() << " us" << std::endl;
return 0;
}
// chrono可以获取epoch(从1971.01.01,0点开始的时间戳)
#include <iostream>
#include <chrono>
using namespace std;
int main()
{
// `std::chrono::system_clock::now()` 表示获取当前系统时间,返回的是时间点类型 variable,精确到纳秒级别。
// `time_since_epoch()` 得到该时间点与 EPOCH (即 1970 年 1 月 1 日 00:00:00 UTC)之间的时间持续长度,单位是纳秒,变量类型为 `std::chrono::duration`。
// 通过 `std::chrono::duration_cast<chrono::milliseconds>` 可以把持续时间长度转换为毫秒数,这里得到的是一个整数变量 `ms`。
// `std::chrono::duration_cast` 是一种时间类型的强制转换,可将高精度的时间类型转换为低精度的时间类型。
// 在 C++ 语言当中,强制类型转换包括隐式类型转换和显式类型转换,
// 对于 `std::chrono` 时间库类型的转换,我们一般使用显式类型转换,并且使用 `std::chrono::duration_cast` 进行精度转换。
auto ms = std::chrono::duration_cast<chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch());
std::cout << "current time " << ms.count() << " ms" << std::endl;
return 0;
}
// 2. 计算程序执行时间
// 在很多编写性能相关的程序时,我们需要精确地计算程序的执行时间,以方便优化或评估程序的性能。
#include <iostream>
#include <chrono>
int main()
{
// 获取任务开始执行的时间戳
auto start = std::chrono::steady_clock::now();
// 执行任务
std::cout << "hello world!" << std::endl;
// 获取任务执行结束时间戳
auto stop = std::chrono::steady_clock::now();
// 求差并输出任务执行时间,转换成us
auto duration = std::chrono::duration_cast<std::chrono::microseconds>(stop - start);
std::cout << "任务执行时间: " << duration.count() << " us" << std::endl;
return 0;
}
// 3. 时间日期计算
// 处理时间日期计算是应用开发中常见的操作。例如,需要计算两个时间点之间的天数,或者日期加减等操作。
// 下面的代码演示了如何计算两个时间点之间的天数差:
// `std::mktime(&timeinfo)`将时间结构体转换为时间戳,然后使用`std::chrono::system_clock::from_time_t()`将时间戳转换为时间点类型,并最后使用持续时长相减求得天数。
#include <iostream>
#include <chrono>
#include <ctime>
int main()
{
std::tm timeinfo1{}, timeinfo2{};
timeinfo1.tm_year = 2022 - 1900;
timeinfo1.tm_mon = 10; // 11月
timeinfo1.tm_mday = 1;
timeinfo2.tm_year = 2021 - 1900;
timeinfo2.tm_mon = 10; // 11月
timeinfo2.tm_mday = 1;
auto tp1 = std::chrono::system_clock::from_time_t(std::mktime(&timeinfo1));
auto tp2 = std::chrono::system_clock::from_time_t(std::mktime(&timeinfo2));
auto days = std::chrono::duration_cast<std::chrono::duration<int, std::ratio<86400>>>(tp1 - tp2);
std::cout << "2021年11月1日到2022年11月1日相差 " << days.count() << " 天." << std::endl;
return 0;
}
// 通过chrono获取当前日期
// 可以使用 C++ STL 中的 `<chrono>` 时间库的 `std::chrono::system_clock` 类和 `std::chrono::time_point` 类进行操作。
// 具体步骤如下:
// 1. 调用 `std::chrono::system_clock::now()` 获取当前精确的时钟时间点。
// 2. 将系统时钟的当前时间点转换为 `std::chrono::time_t` 类型,表示自 1970 年 1 月 1 日以来经过的秒数,可以用 `std::chrono::system_clock::to_time_t` 函数实现。
// 3. 将 `std::chrono::time_t` 类型转换成当前的本地日历时间,可以用标准库中的 `std::localtime` 函数实现,该函数返回的是一个 `struct tm` 结构体。
// 4. 从 `struct tm` 中提取对应的年、月、日信息即可。
#include <iostream>
#include <chrono>
#include <ctime>
int main()
{
// 获取当前系统时钟的时间点
auto now = std::chrono::system_clock::now();
// 将时间转换为time_t类型
std::time_t timeNow = std::chrono::system_clock::to_time_t(now);
// 将time_t类型转换为本地时间结构体
std::tm localtimeNow = *std::localtime(&timeNow);
// 从本地时间结构体中获取年月日信息
int year = localtimeNow.tm_year + 1900; // 年份是从1900年开始计数
int month = localtimeNow.tm_mon + 1; // 月份是从0开始计数,因此要加1
int day = localtimeNow.tm_mday;
int hours = localtimeNow.tm_hour;
int minutes = localtimeNow.tm_min;
int seconds = localtimeNow.tm_sec;
// 打印结果
std::cout << "当前时间:" << year << "年" << month << "月" << day << "日 " << hours << ":" << minutes << ":" << seconds << std::endl;
return 0;
}
// chrono的时钟clock有三个方法
// std::chrono::system_clock: 依据系统当前时间
// std::chrono::steady_clock: 不能设置的时钟,以统一速率运行
// std::chrono::high_resolution_clock: 高分辨率时钟
#include <iostream>
#include <chrono>
#include <thread>
using namespace std;
int main()
{
// 休眠100ms
std::cout << "sleep 100ms start" << std::endl;
std::this_thread::sleep_for(std::chrono::milliseconds(100));
std::cout << "sleep 100ms end" << std::endl;
std::cout << "sleep 1s start" << std::endl;
std::this_thread::sleep_for(std::chrono::seconds(1));
std::cout << "sleep 1s end" << std::endl;
std::cout << "sleep 1min start" << std::endl;
std::this_thread::sleep_for(std::chrono::minutes(1));
std::cout << "sleep 1min end" << std::endl;
std::cout << "sleep 1h start" << std::endl;
std::this_thread::sleep_for(std::chrono::hours(1));
std::cout << "sleep 1h end" << std::endl;
return 0;
}