要编写一个C++程序来查询工作站服务器中每个用户的空间使用量,我们需要利用操作系统的相关API来获取用户信息和目录的使用情况。以下是一个实现此功能的C++程序示例,适用于Linux环境。
/etc/passwd
文件获取系统中的所有用户及其主目录。du
命令或系统调用遍历用户目录,并计算其使用的磁盘空间。以下是完整的C++代码示例:
#include <iostream>
#include <fstream>
#include <sstream>
#include <vector>
#include <map>
#include <cstdio>
#include <cstdlib>
#include <sys/types.h>
#include <pwd.h>
#include <unistd.h>
// 获取系统中的所有用户及其主目录
std::map<std::string, std::string> getUsersHomeDirectories() {
std::map<std::string, std::string> userDirs;
struct passwd *pw;
while ((pw = getpwent()) != NULL) {
userDirs[pw->pw_name] = pw->pw_dir;
}
endpwent();
return userDirs;
}
// 计算目录的磁盘使用量
unsigned long long getDirectorySize(const std::string &dir) {
unsigned long long size = 0;
std::string command = "du -sb " + dir + " | cut -f1";
FILE *pipe = popen(command.c_str(), "r");
if (!pipe) {
std::cerr << "Failed to run du command for directory: " << dir << std::endl;
return 0;
}
char buffer[128];
while (fgets(buffer, sizeof(buffer), pipe) != NULL) {
size = std::strtoull(buffer, NULL, 10);
}
pclose(pipe);
return size;
}
// 主程序
int main() {
// 获取所有用户及其主目录
std::map<std::string, std::string> users = getUsersHomeDirectories();
// 存储用户空间使用情况
std::map<std::string, unsigned long long> userSpaceUsage;
// 计算每个用户的空间使用量
for (const auto &user : users) {
unsigned long long size = getDirectorySize(user.second);
userSpaceUsage[user.first] = size;
}
// 输出结果
std::cout << "User Space Usage:" << std::endl;
for (const auto &entry : userSpaceUsage) {
std::cout << "User: " << entry.first << ", Space Used: " << entry.second << " bytes" << std::endl;
}
return 0;
}
getpwent()
遍历 /etc/passwd
文件中的用户信息,提取用户名和主目录。popen()
函数调用系统命令 du -sb
计算目录大小,并使用 cut
命令提取输出的大小部分。std::map
存储用户及其对应的磁盘使用量,并将结果输出到控制台。graph TD;
A[主程序] --> B[获取用户信息]
B --> C[计算目录大小]
C --> D[存储和输出结果]
B --> E[/etc/passwd文件]
C --> F[du -sb命令]
通过上述代码,您可以在Linux环境下查询每个用户的磁盘使用量。此程序利用系统调用和标准库函数,确保了高效和准确的统计结果。希望此示例能为您的开发提供帮助。