C++与操作系统交互:核心命令与系统调用详解
1. 引言
在C++编程中,与操作系统进行交互是开发系统软件、性能敏感应用和底层工具的关键能力。C++不仅提供标准库函数,还能通过系统调用直接与操作系统内核通信。本文将详细介绍Windows和Linux/Unix系统中常用的C++操作系统交互命令,涵盖进程管理、文件操作、内存管理、网络通信等核心领域。
2. 进程与线程管理
2.1 进程创建与控制
Windows系统
cpp
#include <windows.h> #include <iostream> #include <tchar.h> void CreateProcessExample() { STARTUPINFO si = {sizeof(si)}; PROCESS_INFORMATION pi; ZeroMemory(&si, sizeof(si)); ZeroMemory(&pi, sizeof(pi)); // 创建进程 if (!CreateProcess( NULL, // 应用程序名 _tcsdup(TEXT("notepad.exe")), // 命令行 NULL, // 进程安全属性 NULL, // 线程安全属性 FALSE, // 句柄继承选项 0, // 创建标志 NULL, // 环境变量 NULL, // 当前目录 &si, // STARTUPINFO &pi // PROCESS_INFORMATION )) { std::cerr << "CreateProcess failed: " << GetLastError() << std::endl; return; } std::cout << "进程ID: " << pi.dwProcessId << std::endl; // 等待进程结束 WaitForSingleObject(pi.hProcess, INFINITE); // 关闭句柄 CloseHandle(pi.hProcess); CloseHandle(pi.hThread); } // 获取当前进程信息 void GetProcessInfo() { DWORD pid = GetCurrentProcessId(); HANDLE hProcess = GetCurrentProcess(); std::cout << "当前进程ID: " << pid << std::endl; std::cout << "进程句柄: " << hProcess << std::endl; // 获取进程优先级 DWORD priority = GetPriorityClass(hProcess); std::cout << "进程优先级: " << priority << std::endl; }Linux/Unix系统
cpp
#include <unistd.h> #include <sys/types.h> #include <sys/wait.h> #include <iostream> #include <cstdlib> void ForkExample() { pid_t pid = fork(); if (pid < 0) { std::cerr << "fork失败" << std::endl; exit(1); } else if (pid == 0) { // 子进程 std::cout << "子进程PID: " << getpid() << std::endl; std::cout << "父进程PID: " << getppid() << std::endl; // 执行新程序 execlp("/bin/ls", "ls", "-l", NULL); // execlp返回表示出错 std::cerr << "execlp失败" << std::endl; exit(1); } else { // 父进程 std::cout << "父进程PID: " << getpid() << std::endl; std::cout << "创建的子进程PID: " << pid << std::endl; // 等待子进程结束 int status; waitpid(pid, &status, 0); if (WIFEXITED(status)) { std::cout << "子进程正常退出,退出码: " << WEXITSTATUS(status) << std::endl; } } } // 获取进程信息 void GetProcessInfoUnix() { std::cout << "进程ID: " << getpid() << std::endl; std::cout << "父进程ID: " << getppid() << std::endl; std::cout << "用户ID: " << getuid() << std::endl; std::cout << "有效用户ID: " << geteuid() << std::endl; std::cout << "组ID: " << getgid() << std::endl; std::cout << "有效组ID: " << getegid() << std::endl; }2.2 线程管理
Windows线程API
cpp
#include <windows.h> #include <iostream> DWORD WINAPI ThreadFunction(LPVOID lpParam) { int threadId = *(int*)lpParam; std::cout << "线程 " << threadId << " 开始执行" << std::endl; for (int i = 0; i < 5; i++) { std::cout << "线程 " << threadId << ": " << i << std::endl; Sleep(1000); // 睡眠1秒 } std::cout << "线程 " << threadId << " 结束" << std::endl; return 0; } void CreateThreadExample() { HANDLE hThreads[3]; int threadIds[3] = {1, 2, 3}; // 创建多个线程 for (int i = 0; i < 3; i++) { hThreads[i] = CreateThread( NULL, // 安全属性 0, // 堆栈大小 ThreadFunction, // 线程函数 &threadIds[i], // 参数 0, // 创建标志 NULL // 线程ID ); if (hThreads[i] == NULL) { std::cerr << "创建线程失败: " << GetLastError() << std::endl; } } // 等待所有线程结束 WaitForMultipleObjects(3, hThreads, TRUE, INFINITE); // 关闭句柄 for (int i = 0; i < 3; i++) { CloseHandle(hThreads[i]); } } // 线程同步 - 互斥锁 class MutexExample { private: HANDLE hMutex; int counter; public: MutexExample() : counter(0) { hMutex = CreateMutex(NULL, FALSE, NULL); } ~MutexExample() { CloseHandle(hMutex); } void Increment() { WaitForSingleObject(hMutex, INFINITE); counter++; std::cout << "计数器: " << counter << std::endl; ReleaseMutex(hMutex); } };POSIX线程(Linux/Unix)
cpp
#include <pthread.h> #include <iostream> #include <unistd.h> void* ThreadFunction(void* arg) { int threadId = *(int*)arg; std::cout << "线程 " << threadId << " 开始执行" << std::endl; for (int i = 0; i < 5; i++) { std::cout << "线程 " << threadId << ": " << i << std::endl; sleep(1); } std::cout << "线程 " << threadId << " 结束" << std::endl; pthread_exit(NULL); } void CreatePthreadExample() { pthread_t threads[3]; int threadArgs[3] = {1, 2, 3}; // 创建多个线程 for (int i = 0; i < 3; i++) { int rc = pthread_create(&threads[i], NULL, ThreadFunction, &threadArgs[i]); if (rc) { std::cerr << "创建线程失败: " << rc << std::endl; } } // 等待所有线程结束 for (int i = 0; i < 3; i++) { pthread_join(threads[i], NULL); } } // POSIX互斥锁示例 class PthreadMutexExample { private: pthread_mutex_t mutex; int counter; public: PthreadMutexExample() : counter(0) { pthread_mutex_init(&mutex, NULL); } ~PthreadMutexExample() { pthread_mutex_destroy(&mutex); } void Increment() { pthread_mutex_lock(&mutex); counter++; std::cout << "计数器: " << counter << std::endl; pthread_mutex_unlock(&mutex); } };3. 文件系统操作
3.1 文件创建、读写与删除
Windows文件操作
cpp
#include <windows.h> #include <iostream> #include <string> void FileOperationsWindows() { // 创建文件 HANDLE hFile = CreateFile( L"example.txt", // 文件名 GENERIC_WRITE | GENERIC_READ, // 访问模式 0, // 共享模式 NULL, // 安全属性 CREATE_ALWAYS, // 创建选项 FILE_ATTRIBUTE_NORMAL, // 文件属性 NULL // 模板文件 ); if (hFile == INVALID_HANDLE_VALUE) { std::cerr << "创建文件失败: " << GetLastError() << std::endl; return; } // 写入文件 const char* data = "Hello, Windows File System!"; DWORD bytesWritten; if (!WriteFile(hFile, data, strlen(data), &bytesWritten, NULL)) { std::cerr << "写入文件失败: " << GetLastError() << std::endl; } else { std::cout << "写入字节数: " << bytesWritten << std::endl; } // 移动文件指针到开头 SetFilePointer(hFile, 0, NULL, FILE_BEGIN); // 读取文件 char buffer[100]; DWORD bytesRead; if (ReadFile(hFile, buffer, sizeof(buffer), &bytesRead, NULL)) { buffer[bytesRead] = '\0'; std::cout << "读取内容: " << buffer << std::endl; } // 获取文件信息 BY_HANDLE_FILE_INFORMATION fileInfo; if (GetFileInformationByHandle(hFile, &fileInfo)) { std::cout << "文件大小: " << (static_cast<long long>(fileInfo.nFileSizeHigh) << 32 | fileInfo.nFileSizeLow) << " 字节" << std::endl; } // 关闭文件 CloseHandle(hFile); // 文件属性操作 DWORD attributes = GetFileAttributes(L"example.txt"); if (attributes != INVALID_FILE_ATTRIBUTES) { if (attributes & FILE_ATTRIBUTE_READONLY) { std::cout << "文件是只读的" << std::endl; } // 设置隐藏属性 SetFileAttributes(L"example.txt", attributes | FILE_ATTRIBUTE_HIDDEN); } // 删除文件 if (DeleteFile(L"example.txt")) { std::cout << "文件删除成功" << std::endl; } } // 目录操作 void DirectoryOperations() { // 创建目录 if (CreateDirectory(L"TestDir", NULL)) { std::cout << "目录创建成功" << std::endl; } // 遍历目录 WIN32_FIND_DATA findData; HANDLE hFind = FindFirstFile(L"*.*", &findData); if (hFind != INVALID_HANDLE_VALUE) { do { std::wcout << L"文件名: " << findData.cFileName << L" 大小: " << findData.nFileSizeLow << L" 字节" << std::endl; } while (FindNextFile(hFind, &findData)); FindClose(hFind); } // 删除目录 RemoveDirectory(L"TestDir"); }Linux/Unix文件操作
cpp
#include <iostream> #include <fstream> #include <sys/stat.h> #include <unistd.h> #include <dirent.h> #include <cstring> void FileOperationsUnix() { // 使用C++标准库创建和写入文件 std::ofstream outFile("example.txt"); if (outFile.is_open()) { outFile << "Hello, Unix File System!" << std::endl; outFile.close(); std::cout << "文件写入成功" << std::endl; } // 使用系统调用打开文件 int fd = open("example.txt", O_RDWR | O_CREAT, 0644); if (fd != -1) { const char* data = "追加的内容\n"; write(fd, data, strlen(data)); // 移动文件指针 lseek(fd, 0, SEEK_SET); // 读取文件 char buffer[100]; ssize_t bytesRead = read(fd, buffer, sizeof(buffer)); if (bytesRead > 0) { buffer[bytesRead] = '\0'; std::cout << "读取内容: " << buffer; } close(fd); } // 获取文件状态 struct stat fileStat; if (stat("example.txt", &fileStat) == 0) { std::cout << "文件大小: " << fileStat.st_size << " 字节" << std::endl; std::cout << "最后修改时间: " << ctime(&fileStat.st_mtime); // 检查文件类型 if (S_ISREG(fileStat.st_mode)) { std::cout << "这是一个普通文件" << std::endl; } // 修改权限 chmod("example.txt", 0755); } // 目录操作 void DirectoryOperationsUnix() { // 创建目录 mkdir("TestDir", 0755); // 遍历目录 DIR* dir = opendir("."); if (dir) { struct dirent* entry; while ((entry = readdir(dir)) != NULL) { std::cout << "文件名: " << entry->d_name; // 获取文件信息 struct stat entryStat; if (stat(entry->d_name, &entryStat) == 0) { std::cout << " 大小: " << entryStat.st_size << " 字节"; if (S_ISDIR(entryStat.st_mode)) { std::cout << " [目录]"; } } std::cout << std::endl; } closedir(dir); } // 删除目录 rmdir("TestDir"); } // 删除文件 unlink("example.txt"); }3.2 内存映射文件
Windows内存映射
cpp
#include <windows.h> #include <iostream> void MemoryMappedFileWindows() { // 创建文件 HANDLE hFile = CreateFile( L"mmap_example.dat", GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL ); if (hFile == INVALID_HANDLE_VALUE) { std::cerr << "创建文件失败" << std::endl; return; } // 设置文件大小 const DWORD fileSize = 4096; // 4KB SetFilePointer(hFile, fileSize, NULL, FILE_BEGIN); SetEndOfFile(hFile); // 创建内存映射 HANDLE hMap = CreateFileMapping( hFile, NULL, PAGE_READWRITE, 0, fileSize, NULL ); if (!hMap) { std::cerr << "创建内存映射失败: " << GetLastError() << std::endl; CloseHandle(hFile); return; } // 映射视图 LPVOID pData = MapViewOfFile( hMap, FILE_MAP_ALL_ACCESS, 0, 0, fileSize ); if (!pData) { std::cerr << "映射视图失败: " << GetLastError() << std::endl; } else { // 写入数据 char* data = static_cast<char*>(pData); strcpy(data, "内存映射文件示例"); // 读取数据 std::cout << "读取数据: " << data << std::endl; // 取消映射 UnmapViewOfFile(pData); } // 清理 CloseHandle(hMap); CloseHandle(hFile); // 删除文件 DeleteFile(L"mmap_example.dat"); }Linux/Unix内存映射
cpp
#include <sys/mman.h> #include <fcntl.h> #include <unistd.h> #include <iostream> #include <cstring> void MemoryMappedFileUnix() { // 创建文件 int fd = open("mmap_example.dat", O_RDWR | O_CREAT, 0644); if (fd == -1) { perror("创建文件失败"); return; } // 设置文件大小 const size_t fileSize = 4096; // 4KB if (ftruncate(fd, fileSize) == -1) { perror("设置文件大小失败"); close(fd); return; } // 创建内存映射 void* pData = mmap( NULL, fileSize, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0 ); if (pData == MAP_FAILED) { perror("内存映射失败"); } else { // 写入数据 char* data = static_cast<char*>(pData); strcpy(data, "Linux内存映射文件示例"); // 确保数据写入磁盘 msync(pData, fileSize, MS_SYNC); // 读取数据 std::cout << "读取数据: " << data << std::endl; // 取消映射 munmap(pData, fileSize); } // 清理 close(fd); unlink("mmap_example.dat"); }4. 系统信息与资源管理
4.1 系统信息获取
Windows系统信息
cpp
#include <windows.h> #include <iostream> #include <psapi.h> void SystemInfoWindows() { // 系统基本信息 SYSTEM_INFO sysInfo; GetSystemInfo(&sysInfo); std::cout << "处理器架构: " << sysInfo.wProcessorArchitecture << std::endl; std::cout << "处理器数量: " << sysInfo.dwNumberOfProcessors << std::endl; std::cout << "页面大小: " << sysInfo.dwPageSize << " 字节" << std::endl; // 内存状态 MEMORYSTATUSEX memStatus; memStatus.dwLength = sizeof(memStatus); if (GlobalMemoryStatusEx(&memStatus)) { std::cout << "物理内存总量: " << memStatus.ullTotalPhys / (1024 * 1024) << " MB" << std::endl; std::cout << "可用物理内存: " << memStatus.ullAvailPhys / (1024 * 1024) << " MB" << std::endl; std::cout << "虚拟内存总量: " << memStatus.ullTotalVirtual / (1024 * 1024) << " MB" << std::endl; } // 操作系统版本 OSVERSIONINFOEX osVersion; ZeroMemory(&osVersion, sizeof(OSVERSIONINFOEX)); osVersion.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); if (GetVersionEx((OSVERSIONINFO*)&osVersion)) { std::cout << "Windows版本: " << osVersion.dwMajorVersion << "." << osVersion.dwMinorVersion << std::endl; std::cout << "构建号: " << osVersion.dwBuildNumber << std::endl; } // 计算机名 char computerName[MAX_COMPUTERNAME_LENGTH + 1]; DWORD size = sizeof(computerName); if (GetComputerName(computerName, &size)) { std::cout << "计算机名: " << computerName << std::endl; } // 用户名 char userName[256]; DWORD userNameSize = sizeof(userName); if (GetUserName(userName, &userNameSize)) { std::cout << "用户名: " << userName << std::endl; } } // 进程内存使用情况 void ProcessMemoryInfo() { PROCESS_MEMORY_COUNTERS pmc; if (GetProcessMemoryInfo(GetCurrentProcess(), &pmc, sizeof(pmc))) { std::cout << "工作集大小: " << pmc.WorkingSetSize / 1024 << " KB" << std::endl; std::cout << "峰值工作集大小: " << pmc.PeakWorkingSetSize / 1024 << " KB" << std::endl; std::cout << "页面文件使用: " << pmc.PagefileUsage / 1024 << " KB" << std::endl; } }Linux系统信息
cpp
#include <unistd.h> #include <sys/utsname.h> #include <sys/sysinfo.h> #include <iostream> #include <fstream> void SystemInfoLinux() { // 系统信息 struct utsname uts; if (uname(&uts) == 0) { std::cout << "系统名: " << uts.sysname << std::endl; std::cout << "节点名: " << uts.nodename << std::endl; std::cout << "发行版本: " << uts.release << std::endl; std::cout << "版本: " << uts.version << std::endl; std::cout << "硬件类型: " << uts.machine << std::endl; } // 系统信息 struct sysinfo info; if (sysinfo(&info) == 0) { std::cout << "系统运行时间: " << info.uptime << " 秒" << std::endl; std::cout << "总内存: " << info.totalram / (1024 * 1024) << " MB" << std::endl; std::cout << "空闲内存: " << info.freeram / (1024 * 1024) << " MB" << std::endl; std::cout << "进程数: " << info.procs << std::endl; } // 处理器信息 std::ifstream cpuinfo("/proc/cpuinfo"); if (cpuinfo.is_open()) { std::string line; int processorCount = 0; while (std::getline(cpuinfo, line)) { if (line.find("processor") == 0) { processorCount++; } else if (line.find("model name") != std::string::npos) { std::cout << "CPU型号: " << line.substr(line.find(":") + 2) << std::endl; } } std::cout << "处理器核心数: " << processorCount << std::endl; cpuinfo.close(); } // 内存信息 std::ifstream meminfo("/proc/meminfo"); if (meminfo.is_open()) { std::string line; for (int i = 0; i < 3 && std::getline(meminfo, line); i++) { std::cout << line << std::endl; } meminfo.close(); } // 获取主机名 char hostname[256]; if (gethostname(hostname, sizeof(hostname)) == 0) { std::cout << "主机名: " << hostname << std::endl; } // 获取用户ID信息 std::cout << "用户ID: " << getuid() << std::endl; std::cout << "有效用户ID: " << geteuid() << std::endl; std::cout << "组ID: " << getgid() << std::endl; std::cout << "有效组ID: " << getegid() << std::endl; }4.2 时间和日期操作
Windows时间函数
cpp
#include <windows.h> #include <iostream> #include <chrono> #include <iomanip> void TimeFunctionsWindows() { // 获取系统时间 SYSTEMTIME sysTime; GetLocalTime(&sysTime); std::cout << "当前时间: " << sysTime.wYear << "-" << std::setw(2) << std::setfill('0') << sysTime.wMonth << "-" << std::setw(2) << std::setfill('0') << sysTime.wDay << " " << std::setw(2) << std::setfill('0') << sysTime.wHour << ":" << std::setw(2) << std::setfill('0') << sysTime.wMinute << ":" << std::setw(2) << std::setfill('0') << sysTime.wSecond << std::endl; // 获取文件时间 HANDLE hFile = CreateFile( L"example.txt", GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ); if (hFile != INVALID_HANDLE_VALUE) { FILETIME createTime, accessTime, writeTime; if (GetFileTime(hFile, &createTime, &accessTime, &writeTime)) { // 转换文件时间为系统时间 SYSTEMTIME sysCreateTime; FileTimeToSystemTime(&createTime, &sysCreateTime); std::cout << "文件创建时间: " << sysCreateTime.wYear << "-" << sysCreateTime.wMonth << "-" << sysCreateTime.wDay << std::endl; } CloseHandle(hFile); } // 高精度计时器 LARGE_INTEGER frequency, start, end; QueryPerformanceFrequency(&frequency); QueryPerformanceCounter(&start); // 执行一些操作 Sleep(100); QueryPerformanceCounter(&end); double elapsed = static_cast<double>(end.QuadPart - start.QuadPart) / frequency.QuadPart; std::cout << "耗时: " << elapsed << " 秒" << std::endl; // C++11 时间库 auto now = std::chrono::system_clock::now(); auto time_t_now = std::chrono::system_clock::to_time_t(now); std::cout << "C++11 时间: " << std::ctime(&time_t_now); }Linux时间函数
cpp
#include <iostream> #include <ctime> #include <sys/time.h> #include <chrono> #include <iomanip> void TimeFunctionsLinux() { // time_t 时间 time_t rawtime; time(&rawtime); std::cout << "当前时间戳: " << rawtime << std::endl; std::cout << "格式化时间: " << ctime(&rawtime); // 本地时间结构 struct tm* localTime = localtime(&rawtime); std::cout << "本地时间: " << 1900 + localTime->tm_year << "-" << std::setw(2) << std::setfill('0') << 1 + localTime->tm_mon << "-" << std::setw(2) << std::setfill('0') << localTime->tm_mday << " " << std::setw(2) << std::setfill('0') << localTime->tm_hour << ":" << std::setw(2) << std::setfill('0') << localTime->tm_min << ":" << std::setw(2) << std::setfill('0') << localTime->tm_sec << std::endl; // 高精度时间 (gettimeofday) struct timeval tv; gettimeofday(&tv, NULL); std::cout << "秒: " << tv.tv_sec << ", 微秒: " << tv.tv_usec << std::endl; // 时钟时间 clock_t clockTime = clock(); std::cout << "处理器时间: " << static_cast<double>(clockTime) / CLOCKS_PER_SEC << " 秒" << std::endl; // 文件时间 struct stat fileStat; if (stat("example.txt", &fileStat) == 0) { std::cout << "文件最后访问时间: " << ctime(&fileStat.st_atime); std::cout << "文件最后修改时间: " << ctime(&fileStat.st_mtime); std::cout << "文件状态改变时间: " << ctime(&fileStat.st_ctime); } // C++11 时间库 auto now = std::chrono::system_clock::now(); auto now_c = std::chrono::system_clock::to_time_t(now); std::cout << "C++11 时间: " << std::ctime(&now_c); // 高精度计时 auto start = std::chrono::high_resolution_clock::now(); // 执行一些操作 volatile int sum = 0; for (int i = 0; i < 1000000; i++) { sum += i; } auto end = std::chrono::high_resolution_clock::now(); auto duration = std::chrono::duration_cast<std::chrono::microseconds>(end - start); std::cout << "耗时: " << duration.count() << " 微秒" << std::endl; }5. 网络通信基础
5.1 Windows Socket编程
cpp
#include <winsock2.h> #include <ws2tcpip.h> #include <iostream> #include <string> #pragma comment(lib, "ws2_32.lib") class WindowsSocketExample { private: WSADATA wsaData; SOCKET serverSocket; public: WindowsSocketExample() : serverSocket(INVALID_SOCKET) { // 初始化Winsock if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) { throw std::runtime_error("WSAStartup失败"); } } ~WindowsSocketExample() { if (serverSocket != INVALID_SOCKET) { closesocket(serverSocket); } WSACleanup(); } void CreateTCPServer(int port) { // 创建socket serverSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (serverSocket == INVALID_SOCKET) { throw std::runtime_error("创建socket失败: " + std::to_string(WSAGetLastError())); } // 绑定地址 sockaddr_in serverAddr; serverAddr.sin_family = AF_INET; serverAddr.sin_addr.s_addr = INADDR_ANY; serverAddr.sin_port = htons(port); if (bind(serverSocket, (sockaddr*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) { closesocket(serverSocket); throw std::runtime_error("绑定失败: " + std::to_string(WSAGetLastError())); } // 监听连接 if (listen(serverSocket, SOMAXCONN) == SOCKET_ERROR) { closesocket(serverSocket); throw std::runtime_error("监听失败: " + std::to_string(WSAGetLastError())); } std::cout << "服务器在端口 " << port << " 监听中..." << std::endl; // 接受连接 sockaddr_in clientAddr; int clientAddrSize = sizeof(clientAddr); SOCKET clientSocket = accept(serverSocket, (sockaddr*)&clientAddr, &clientAddrSize); if (clientSocket == INVALID_SOCKET) { std::cerr << "接受连接失败: " << WSAGetLastError() << std::endl; return; } char clientIP[INET_ADDRSTRLEN]; inet_ntop(AF_INET, &clientAddr.sin_addr, clientIP, INET_ADDRSTRLEN); std::cout << "客户端连接: " << clientIP << ":" << ntohs(clientAddr.sin_port) << std::endl; // 接收数据 char buffer[1024]; int bytesReceived = recv(clientSocket, buffer, sizeof(buffer), 0); if (bytesReceived > 0) { buffer[bytesReceived] = '\0'; std::cout << "收到数据: " << buffer << std::endl; // 发送响应 const char* response = "HTTP/1.1 200 OK\r\nContent-Length: 13\r\n\r\nHello, Client!"; send(clientSocket, response, strlen(response), 0); } closesocket(clientSocket); } void CreateTCPClient(const std::string& serverIP, int port) { SOCKET clientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (clientSocket == INVALID_SOCKET) { throw std::runtime_error("创建socket失败: " + std::to_string(WSAGetLastError())); } // 解析服务器地址 sockaddr_in serverAddr; serverAddr.sin_family = AF_INET; serverAddr.sin_port = htons(port); inet_pton(AF_INET, serverIP.c_str(), &serverAddr.sin_addr); // 连接服务器 if (connect(clientSocket, (sockaddr*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) { closesocket(clientSocket); throw std::runtime_error("连接失败: " + std::to_string(WSAGetLastError())); } // 发送数据 const char* message = "GET / HTTP/1.1\r\nHost: localhost\r\n\r\n"; send(clientSocket, message, strlen(message), 0); // 接收响应 char buffer[4096]; int bytesReceived = recv(clientSocket, buffer, sizeof(buffer), 0); if (bytesReceived > 0) { buffer[bytesReceived] = '\0'; std::cout << "服务器响应: " << std::endl << buffer << std::endl; } closesocket(clientSocket); } // UDP通信示例 void UDPServer(int port) { SOCKET udpSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if (udpSocket == INVALID_SOCKET) { throw std::runtime_error("创建UDP socket失败"); } sockaddr_in serverAddr; serverAddr.sin_family = AF_INET; serverAddr.sin_addr.s_addr = INADDR_ANY; serverAddr.sin_port = htons(port); if (bind(udpSocket, (sockaddr*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) { closesocket(udpSocket); throw std::runtime_error("UDP绑定失败"); } std::cout << "UDP服务器在端口 " << port << " 监听中..." << std::endl; char buffer[1024]; sockaddr_in clientAddr; int clientAddrSize = sizeof(clientAddr); while (true) { int bytesReceived = recvfrom(udpSocket, buffer, sizeof(buffer), 0, (sockaddr*)&clientAddr, &clientAddrSize); if (bytesReceived > 0) { buffer[bytesReceived] = '\0'; std::cout << "收到UDP数据: " << buffer << std::endl; // 发送回应 const char* response = "UDP响应"; sendto(udpSocket, response, strlen(response), 0, (sockaddr*)&clientAddr, clientAddrSize); } } closesocket(udpSocket); } };5.2 Linux Socket编程
cpp
#include <iostream> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #include <cstring> #include <string> class LinuxSocketExample { public: void CreateTCPServer(int port) { // 创建socket int serverSocket = socket(AF_INET, SOCK_STREAM, 0); if (serverSocket < 0) { perror("创建socket失败"); return; } // 设置socket选项,避免地址占用 int opt = 1; setsockopt(serverSocket, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)); // 绑定地址 sockaddr_in serverAddr; serverAddr.sin_family = AF_INET; serverAddr.sin_addr.s_addr = INADDR_ANY; serverAddr.sin_port = htons(port); if (bind(serverSocket, (sockaddr*)&serverAddr, sizeof(serverAddr)) < 0) { perror("绑定失败"); close(serverSocket); return; } // 监听连接 if (listen(serverSocket, 5) < 0) { perror("监听失败"); close(serverSocket); return; } std::cout << "服务器在端口 " << port << " 监听中..." << std::endl; // 接受连接 sockaddr_in clientAddr; socklen_t clientAddrSize = sizeof(clientAddr); int clientSocket = accept(serverSocket, (sockaddr*)&clientAddr, &clientAddrSize); if (clientSocket < 0) { perror("接受连接失败"); close(serverSocket); return; } char clientIP[INET_ADDRSTRLEN]; inet_ntop(AF_INET, &clientAddr.sin_addr, clientIP, INET_ADDRSTRLEN); std::cout << "客户端连接: " << clientIP << ":" << ntohs(clientAddr.sin_port) << std::endl; // 接收数据 char buffer[1024]; ssize_t bytesReceived = recv(clientSocket, buffer, sizeof(buffer), 0); if (bytesReceived > 0) { buffer[bytesReceived] = '\0'; std::cout << "收到数据: " << buffer << std::endl; // 发送响应 const char* response = "HTTP/1.1 200 OK\r\nContent-Length: 13\r\n\r\nHello, Client!"; send(clientSocket, response, strlen(response), 0); } close(clientSocket); close(serverSocket); } void CreateTCPClient(const std::string& serverIP, int port) { int clientSocket = socket(AF_INET, SOCK_STREAM, 0); if (clientSocket < 0) { perror("创建socket失败"); return; } // 解析服务器地址 sockaddr_in serverAddr; serverAddr.sin_family = AF_INET; serverAddr.sin_port = htons(port); if (inet_pton(AF_INET, serverIP.c_str(), &serverAddr.sin_addr) <= 0) { perror("地址转换失败"); close(clientSocket); return; } // 连接服务器 if (connect(clientSocket, (sockaddr*)&serverAddr, sizeof(serverAddr)) < 0) { perror("连接失败"); close(clientSocket); return; } // 发送数据 const char* message = "GET / HTTP/1.1\r\nHost: localhost\r\n\r\n"; send(clientSocket, message, strlen(message), 0); // 接收响应 char buffer[4096]; ssize_t bytesReceived = recv(clientSocket, buffer, sizeof(buffer), 0); if (bytesReceived > 0) { buffer[bytesReceived] = '\0'; std::cout << "服务器响应: " << std::endl << buffer << std::endl; } close(clientSocket); } // UDP通信示例 void UDPServer(int port) { int udpSocket = socket(AF_INET, SOCK_DGRAM, 0); if (udpSocket < 0) { perror("创建UDP socket失败"); return; } sockaddr_in serverAddr; serverAddr.sin_family = AF_INET; serverAddr.sin_addr.s_addr = INADDR_ANY; serverAddr.sin_port = htons(port); if (bind(udpSocket, (sockaddr*)&serverAddr, sizeof(serverAddr)) < 0) { perror("UDP绑定失败"); close(udpSocket); return; } std::cout << "UDP服务器在端口 " << port << " 监听中..." << std::endl; char buffer[1024]; sockaddr_in clientAddr; socklen_t clientAddrSize = sizeof(clientAddr); while (true) { ssize_t bytesReceived = recvfrom(udpSocket, buffer, sizeof(buffer), 0, (sockaddr*)&clientAddr, &clientAddrSize); if (bytesReceived > 0) { buffer[bytesReceived] = '\0'; std::cout << "收到UDP数据: " << buffer << std::endl; // 发送回应 const char* response = "UDP响应"; sendto(udpSocket, response, strlen(response), 0, (sockaddr*)&clientAddr, clientAddrSize); } } close(udpSocket); } };6. 信号与异常处理
6.1 Linux信号处理
cpp
#include <iostream> #include <csignal> #include <unistd.h> #include <cstdlib> volatile sig_atomic_t signalReceived = 0; // 信号处理函数 void SignalHandler(int signum) { signalReceived = signum; switch (signum) { case SIGINT: std::cout << "收到中断信号 (Ctrl+C)" << std::endl; break; case SIGTERM: std::cout << "收到终止信号" << std::endl; break; case SIGUSR1: std::cout << "收到用户自定义信号1" << std::endl; break; case SIGUSR2: std::cout << "收到用户自定义信号2" << std::endl; break; case SIGALRM: std::cout << "收到闹钟信号" << std::endl; break; default: std::cout << "收到未知信号: " << signum << std::endl; } } void SignalExample() { // 注册信号处理函数 signal(SIGINT, SignalHandler); signal(SIGTERM, SignalHandler); signal(SIGUSR1, SignalHandler); signal(SIGUSR2, SignalHandler); signal(SIGALRM, SignalHandler); // 设置闹钟 alarm(5); std::cout << "进程ID: " << getpid() << std::endl; std::cout << "发送信号示例:" << std::endl; std::cout << " kill -USR1 " << getpid() << std::endl; std::cout << " kill -USR2 " << getpid() << std::endl; std::cout << " kill -INT " << getpid() << " (或按Ctrl+C)" << std::endl; while (true) { if (signalReceived) { if (signalReceived == SIGINT || signalReceived == SIGTERM) { std::cout << "程序退出" << std::endl; exit(0); } signalReceived = 0; } std::cout << "." << std::flush; sleep(1); } } // 使用sigaction的高级信号处理 void AdvancedSignalHandling() { struct sigaction sa; // 设置信号处理函数 sa.sa_handler = SignalHandler; sigemptyset(&sa.sa_mask); sa.sa_flags = 0; // 注册信号 sigaction(SIGINT, &sa, NULL); sigaction(SIGTERM, &sa, NULL); // 阻塞信号 sigset_t blockSet, oldSet; sigemptyset(&blockSet); sigaddset(&blockSet, SIGINT); // 设置信号屏蔽 sigprocmask(SIG_BLOCK, &blockSet, &oldSet); std::cout << "SIGINT信号被阻塞,按Ctrl+C不会立即响应" << std::endl; sleep(5); // 解除阻塞 std::cout << "解除SIGINT阻塞" << std::endl; sigprocmask(SIG_SETMASK, &oldSet, NULL); // 等待信号 sigset_t waitSet; sigemptyset(&waitSet); sigaddset(&waitSet, SIGUSR1); std::cout << "等待SIGUSR1信号..." << std::endl; int sig; sigwait(&waitSet, &sig); std::cout << "收到信号: " << sig << std::endl; }6.2 Windows异常处理
cpp
#include <windows.h> #include <iostream> #include <exception> // 结构化异常处理 (SEH) void SEHExample() { __try { std::cout << "在try块中" << std::endl; // 模拟访问违规 int* ptr = nullptr; // *ptr = 42; // 这会引发异常 // 手动触发异常 RaiseException(EXCEPTION_ACCESS_VIOLATION, 0, 0, NULL); } __except(GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) { std::cout << "捕获到访问违规异常" << std::endl; // 获取异常信息 EXCEPTION_RECORD* exRecord = GetExceptionInformation()->ExceptionRecord; std::cout << "异常代码: 0x" << std::hex << exRecord->ExceptionCode << std::dec << std::endl; std::cout << "异常地址: " << exRecord->ExceptionAddress << std::endl; } } // 向量化异常处理 (VEH) LONG WINAPI VectoredHandler(PEXCEPTION_POINTERS ExceptionInfo) { if (ExceptionInfo->ExceptionRecord->ExceptionCode == EXCEPTION_ACCESS_VIOLATION) { std::cout << "VEH: 捕获到访问违规异常" << std::endl; // 修复问题并继续执行 ExceptionInfo->ContextRecord->Eip += 2; // 跳过有问题的指令 return EXCEPTION_CONTINUE_EXECUTION; } return EXCEPTION_CONTINUE_SEARCH; } void VEHExample() { // 注册向量化异常处理器 PVOID handler = AddVectoredExceptionHandler(1, VectoredHandler); __try { std::cout << "尝试有问题的操作" << std::endl; // 这段代码会导致访问违规,但会被VEH处理器捕获并修复 __asm { xor eax, eax mov [eax], 1 // 写入地址0,这通常会导致访问违规 } std::cout << "继续执行" << std::endl; } __finally { std::cout << "在finally块中" << std::endl; } // 移除异常处理器 RemoveVectoredExceptionHandler(handler); } // C++异常与Windows异常结合 class WindowsException : public std::exception { private: DWORD errorCode; std::string message; public: WindowsException(DWORD code) : errorCode(code) { LPSTR buffer = nullptr; FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, code, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPSTR)&buffer, 0, NULL ); if (buffer) { message = buffer; LocalFree(buffer); } else { message = "未知错误"; } } const char* what() const noexcept override { return message.c_str(); } DWORD GetErrorCode() const { return errorCode; } }; void ThrowWindowsException() { // 模拟一个Windows API调用失败 if (!SetCurrentDirectory(L"不存在的目录")) { throw WindowsException(GetLastError()); } }7. 跨平台兼容性处理
7.1 条件编译与平台检测
cpp
// platform_utils.h #pragma once #ifdef _WIN32 #define PLATFORM_WINDOWS 1 #define PLATFORM_LINUX 0 #define PLATFORM_MAC 0 #elif __linux__ #define PLATFORM_WINDOWS 0 #define PLATFORM_LINUX 1 #define PLATFORM_MAC 0 #elif __APPLE__ #define PLATFORM_WINDOWS 0 #define PLATFORM_LINUX 0 #define PLATFORM_MAC 1 #else #error "未知平台" #endif // 平台特定的包含文件 #if PLATFORM_WINDOWS #include <windows.h> #include <direct.h> #define PATH_SEPARATOR '\\' #define mkdir _mkdir #else #include <unistd.h> #include <sys/stat.h> #include <sys/types.h> #include <dirent.h> #define PATH_SEPARATOR '/' #endif // 跨平台抽象类 class PlatformFile { private: #if PLATFORM_WINDOWS HANDLE fileHandle; #else int fileDescriptor; #endif std::string fileName; public: PlatformFile(const std::string& name); ~PlatformFile(); bool Open(); bool Close(); size_t Read(void* buffer, size_t size); size_t Write(const void* buffer, size_t size); // 静态工具方法 static bool CreateDirectory(const std::string& path); static bool DeleteFile(const std::string& path); static bool FileExists(const std::string& path); static std::string GetCurrentDirectory(); static std::vector<std::string> ListFiles(const std::string& directory); }; // 实现文件 PlatformFile::PlatformFile(const std::string& name) : fileName(name) { #if PLATFORM_WINDOWS fileHandle = INVALID_HANDLE_VALUE; #else fileDescriptor = -1; #endif } bool PlatformFile::Open() { #if PLATFORM_WINDOWS fileHandle = CreateFile( fileName.c_str(), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL ); return fileHandle != INVALID_HANDLE_VALUE; #else fileDescriptor = open( fileName.c_str(), O_RDWR | O_CREAT, 0644 ); return fileDescriptor != -1; #endif } size_t PlatformFile::Read(void* buffer, size_t size) { #if PLATFORM_WINDOWS DWORD bytesRead; if (ReadFile(fileHandle, buffer, size, &bytesRead, NULL)) { return bytesRead; } return 0; #else ssize_t result = read(fileDescriptor, buffer, size); return result > 0 ? result : 0; #endif } bool PlatformFile::CreateDirectory(const std::string& path) { #if PLATFORM_WINDOWS return _mkdir(path.c_str()) == 0; #else return mkdir(path.c_str(), 0755) == 0; #endif }7.2 使用Boost库简化跨平台开发
cpp
#include <boost/filesystem.hpp> #include <boost/asio.hpp> #include <boost/thread.hpp> #include <iostream> namespace fs = boost::filesystem; void BoostFilesystemExample() { // 路径操作 fs::path currentPath = fs::current_path(); std::cout << "当前目录: " << currentPath << std::endl; // 创建目录 fs::path newDir = currentPath / "boost_test"; if (!fs::exists(newDir)) { fs::create_directory(newDir); std::cout << "创建目录: " << newDir << std::endl; } // 遍历目录 std::cout << "目录内容:" << std::endl; for (const auto& entry : fs::directory_iterator(currentPath)) { std::cout << " " << entry.path().filename(); if (fs::is_directory(entry.status())) { std::cout << " [目录]"; } else if (fs::is_regular_file(entry.status())) { std::cout << " [" << fs::file_size(entry) << " 字节]"; } std::cout << std::endl; } // 文件操作 fs::path testFile = newDir / "test.txt"; std::ofstream ofs(testFile.string()); ofs << "Boost Filesystem示例" << std::endl; ofs.close(); // 获取文件信息 if (fs::exists(testFile)) { std::cout << "文件大小: " << fs::file_size(testFile) << " 字节" << std::endl; std::cout << "最后修改时间: " << fs::last_write_time(testFile) << std::endl; } // 删除操作 fs::remove_all(newDir); } // 使用Boost.Asio进行跨平台网络编程 void BoostAsioExample() { boost::asio::io_service ioService; // TCP客户端 boost::asio::ip::tcp::resolver resolver(ioService); boost::asio::ip::tcp::resolver::query query("www.example.com", "http"); boost::asio::ip::tcp::resolver::iterator endpoint_iterator = resolver.resolve(query); boost::asio::ip::tcp::socket socket(ioService); boost::asio::connect(socket, endpoint_iterator); // 发送HTTP请求 std::string request = "GET / HTTP/1.1\r\nHost: www.example.com\r\nConnection: close\r\n\r\n"; boost::asio::write(socket, boost::asio::buffer(request)); // 读取响应 boost::asio::streambuf response; boost::asio::read_until(socket, response, "\r\n"); std::istream response_stream(&response); std::string http_version; response_stream >> http_version; unsigned int status_code; response_stream >> status_code; std::string status_message; std::getline(response_stream, status_message); std::cout << "响应: " << http_version << " " << status_code << " " << status_message << std::endl; } // 使用Boost.Thread进行跨平台线程编程 void BoostThreadExample() { auto threadFunc = [](int id) { for (int i = 0; i < 5; i++) { std::cout << "线程 " << id << ": " << i << std::endl; boost::this_thread::sleep(boost::posix_time::seconds(1)); } }; boost::thread_group threads; for (int i = 0; i < 3; i++) { threads.create_thread(boost::bind(threadFunc, i)); } threads.join_all(); std::cout << "所有线程完成" << std::endl; }8. 性能监控与调优
8.1 Windows性能计数器
cpp
#include <windows.h> #include <pdh.h> #include <iostream> #pragma comment(lib, "pdh.lib") class WindowsPerformanceMonitor { private: PDH_HQUERY query; PDH_HCOUNTER cpuCounter; PDH_HCOUNTER memoryCounter; public: WindowsPerformanceMonitor() : query(NULL) { // 初始化PDH查询 if (PdhOpenQuery(NULL, 0, &query) != ERROR_SUCCESS) { throw std::runtime_error("打开PDH查询失败"); } // 添加CPU计数器 if (PdhAddCounter(query, TEXT("\\Processor(_Total)\\% Processor Time"), 0, &cpuCounter) != ERROR_SUCCESS) { PdhCloseQuery(query); throw std::runtime_error("添加CPU计数器失败"); } // 添加内存计数器 if (PdhAddCounter(query, TEXT("\\Memory\\Available MBytes"), 0, &memoryCounter) != ERROR_SUCCESS) { PdhCloseQuery(query); throw std::runtime_error("添加内存计数器失败"); } // 收集初始数据 PdhCollectQueryData(query); } ~WindowsPerformanceMonitor() { if (query) { PdhCloseQuery(query); } } void GetPerformanceData() { // 收集数据 if (PdhCollectQueryData(query) != ERROR_SUCCESS) { throw std::runtime_error("收集性能数据失败"); } // 获取CPU使用率 PDH_FMT_COUNTERVALUE cpuValue; if (PdhGetFormattedCounterValue(cpuCounter, PDH_FMT_DOUBLE, NULL, &cpuValue) == ERROR_SUCCESS) { std::cout << "CPU使用率: " << cpuValue.doubleValue << "%" << std::endl; } // 获取可用内存 PDH_FMT_COUNTERVALUE memoryValue; if (PdhGetFormattedCounterValue(memoryCounter, PDH_FMT_LONG, NULL, &memoryValue) == ERROR_SUCCESS) { std::cout << "可用内存: " << memoryValue.longValue << " MB" << std::endl; } } // 监控进程性能 void MonitorProcess(DWORD processId) { PDH_HCOUNTER processCounter; std::wstring counterPath = L"\\Process(" + std::to_wstring(processId) + L")\\ID Process"; if (PdhAddCounter(query, counterPath.c_str(), 0, &processCounter) == ERROR_SUCCESS) { // 获取进程性能数据 PDH_FMT_COUNTERVALUE value; if (PdhGetFormattedCounterValue(processCounter, PDH_FMT_LONG, NULL, &value) == ERROR_SUCCESS) { std::cout << "进程ID: " << value.longValue << std::endl; } PdhRemoveCounter(processCounter); } } };8.2 Linux性能监控
cpp
#include <iostream> #include <fstream> #include <sstream> #include <string> #include <sys/resource.h> #include <unistd.h> class LinuxPerformanceMonitor { public: // 获取CPU使用率 void GetCPUUsage() { std::ifstream statFile("/proc/stat"); std::string line; if (std::getline(statFile, line)) { std::istringstream iss(line); std::string cpuLabel; long user, nice, system, idle, iowait, irq, softirq; iss >> cpuLabel >> user >> nice >> system >> idle >> iowait >> irq >> softirq; long total = user + nice + system + idle + iowait + irq + softirq; long idleTime = idle + iowait; static long prevTotal = 0, prevIdle = 0; if (prevTotal > 0) { long totalDiff = total - prevTotal; long idleDiff = idleTime - prevIdle; double cpuUsage = 100.0 * (1.0 - static_cast<double>(idleDiff) / totalDiff); std::cout << "CPU使用率: " << cpuUsage << "%" << std::endl; } prevTotal = total; prevIdle = idleTime; } statFile.close(); } // 获取内存使用情况 void GetMemoryUsage() { std::ifstream meminfoFile("/proc/meminfo"); std::string line; long totalMem = 0, freeMem = 0, availableMem = 0; while (std::getline(meminfoFile, line)) { std::istringstream iss(line); std::string key; long value; std::string unit; iss >> key >> value >> unit; if (key == "MemTotal:") { totalMem = value; } else if (key == "MemFree:") { freeMem = value; } else if (key == "MemAvailable:") { availableMem = value; } if (totalMem > 0 && availableMem > 0) { break; } } if (totalMem > 0) { double usedMem = totalMem - availableMem; double usagePercentage = (usedMem / totalMem) * 100.0; std::cout << "内存使用: " << usagePercentage << "%" << std::endl; std::cout << "总内存: " << totalMem / 1024 << " MB" << std::endl; std::cout << "可用内存: " << availableMem / 1024 << " MB" << std::endl; } meminfoFile.close(); } // 获取进程资源使用 void GetProcessResourceUsage() { struct rusage usage; if (getrusage(RUSAGE_SELF, &usage) == 0) { std::cout << "用户CPU时间: " << usage.ru_utime.tv_sec << " 秒" << usage.ru_utime.tv_usec << " 微秒" << std::endl; std::cout << "系统CPU时间: " << usage.ru_stime.tv_sec << " 秒" << usage.ru_stime.tv_usec << " 微秒" << std::endl; std::cout << "最大常驻集大小: " << usage.ru_maxrss << " KB" << std::endl; std::cout << "缺页次数: " << usage.ru_majflt << std::endl; std::cout << "输入操作: " << usage.ru_inblock << std::endl; std::cout << "输出操作: " << usage.ru_oublock << std::endl; } } // 监控特定进程 void MonitorProcess(int pid) { std::string statPath = "/proc/" + std::to_string(pid) + "/stat"; std::ifstream statFile(statPath); if (statFile.is_open()) { std::string line; std::getline(statFile, line); std::istringstream iss(line); std::vector<std::string> tokens; std::string token; while (iss >> token) { tokens.push_back(token); } if (tokens.size() >= 24) { std::cout << "进程状态: " << tokens[2] << std::endl; std::cout << "父进程ID: " << tokens[3] << std::endl; std::cout << "进程组ID: " << tokens[4] << std::endl; std::cout << "会话ID: " << tokens[5] << std::endl; // 虚拟内存大小 unsigned long vsize = std::stoul(tokens[22]); std::cout << "虚拟内存: " << vsize / 1024 << " KB" << std::endl; // 驻留集大小(页面数) long rss = std::stol(tokens[23]); std::cout << "常驻内存: " << rss * getpagesize() / 1024 << " KB" << std::endl; } statFile.close(); } // 获取进程状态 std::string statusPath = "/proc/" + std::to_string(pid) + "/status"; std::ifstream statusFile(statusPath); if (statusFile.is_open()) { std::string line; for (int i = 0; i < 10 && std::getline(statusFile, line); i++) { std::cout << line << std::endl; } statusFile.close(); } } };9. 总结与最佳实践
9.1 跨平台开发建议
抽象平台差异
创建统一的接口层
使用条件编译处理平台特定代码
考虑使用第三方跨平台库
错误处理策略
统一错误码和异常处理
提供详细的错误信息
实现适当的资源清理
性能考虑
避免频繁的系统调用
合理使用缓冲和缓存
注意资源泄漏问题
9.2 安全注意事项
权限管理
遵循最小权限原则
验证用户输入
安全地处理文件路径
资源管理
及时释放系统资源
检查函数返回值
实现适当的超时机制
内存安全
避免缓冲区溢出
使用智能指针管理资源
验证内存分配结果
9.3 调试与测试技巧
系统调用跟踪
使用strace/dtruss追踪系统调用
利用Windows事件追踪
实现详细的日志记录
性能分析
使用性能分析工具
监控系统资源使用
优化关键路径
通过掌握这些C++与操作系统交互的核心技术,开发者可以编写出高效、稳定且可移植的系统级应用程序。在实际开发中,应根据具体需求选择合适的API和工具,并始终关注代码的安全性和可维护性。