网站系统繁忙,哪个网站有ae免费模板,网站开发研究背景,哪种网络营销方式最好C与操作系统交互#xff1a;核心命令与系统调用详解1. 引言在C编程中#xff0c;与操作系统进行交互是开发系统软件、性能敏感应用和底层工具的关键能力。C不仅提供标准库函数#xff0c;还能通过系统调用直接与操作系统内核通信。本文将详细介绍Windows和Linux/Unix系统中常…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线程APIcpp#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/Unixcpp#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( Lexample.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_castlong long(fileInfo.nFileSizeHigh) 32 | fileInfo.nFileSizeLow) 字节 std::endl; } // 关闭文件 CloseHandle(hFile); // 文件属性操作 DWORD attributes GetFileAttributes(Lexample.txt); if (attributes ! INVALID_FILE_ATTRIBUTES) { if (attributes FILE_ATTRIBUTE_READONLY) { std::cout 文件是只读的 std::endl; } // 设置隐藏属性 SetFileAttributes(Lexample.txt, attributes | FILE_ATTRIBUTE_HIDDEN); } // 删除文件 if (DeleteFile(Lexample.txt)) { std::cout 文件删除成功 std::endl; } } // 目录操作 void DirectoryOperations() { // 创建目录 if (CreateDirectory(LTestDir, 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(LTestDir); }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( Lmmap_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_castchar*(pData); strcpy(data, 内存映射文件示例); // 读取数据 std::cout 读取数据: data std::endl; // 取消映射 UnmapViewOfFile(pData); } // 清理 CloseHandle(hMap); CloseHandle(hFile); // 删除文件 DeleteFile(Lmmap_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_castchar*(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( Lexample.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_castdouble(end.QuadPart - start.QuadPart) / frequency.QuadPart; std::cout 耗时: elapsed 秒 std::endl; // C11 时间库 auto now std::chrono::system_clock::now(); auto time_t_now std::chrono::system_clock::to_time_t(now); std::cout C11 时间: 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_castdouble(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); } // C11 时间库 auto now std::chrono::system_clock::now(); auto now_c std::chrono::system_clock::to_time_t(now); std::cout C11 时间: 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_caststd::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 收到中断信号 (CtrlC) 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() (或按CtrlC) 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信号被阻塞按CtrlC不会立即响应 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::vectorstd::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_castdouble(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::vectorstd::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和工具并始终关注代码的安全性和可维护性。