我正在制作一个负载均衡器(一个非常简单的)。它查看用户空闲的时间以及系统上的负载,以确定进程是否可以运行,并以循环方式遍历进程。
控制流程所需的所有数据都存储在文本文件中。 该文件可能如下所示:
PID=4390 IDLE=0.000000 BUSY=2.000000 USER=2.000000
PID=4397 IDLE=3.000000 BUSY=1.500000 USER=4.000000
PID=4405 IDLE=0.000000 BUSY=2.000000 USER=2.000000
PID=4412 IDLE=0.000000 BUSY=2.000000 USER=2.000000
PID=4420 IDLE=3.000000 BUSY=1.500000 USER=4.000000
这是一项大学作业,但是解析文本文件不应该是其中的重要部分,这意味着我可以使用对我来说最快实现的任何方式。
此文件中的条目将随着流程完成或在控制下添加而添加和删除。
关于如何解析这个有什么想法吗?
谢谢。
最佳答案
下面的代码将解析您的文件,并考虑到您的文件可能不可用(即 fopen
可能会失败),或者在您读取文件时被写入(即也就是说,fscanf
可能会失败)。请注意,您可能不想使用无限循环(与要在项目中复制粘贴的实际代码相比,伪代码更多,我没有尝试运行它)。另请注意,考虑到那里的 sleep 持续时间,它可能会相当慢:您可能想要使用更高级的方法,这更像是一种黑客攻击。
int pid;
float idle, busy, user;
FILE* fid;
fpos_t pos;
int pos_init = 0;
while (1)
{
// try to open the file
if ((fid = fopen("myfile.txt","rw+")) == NULL)
{
sleep(1); // sleep for a little while, and try again
continue;
}
// reset position in file (if initialized)
if (pos_init)
fsetpos (pFile,&pos);
// read as many line as you can
while (!feof(fid))
{
if (fscanf(fid,"PID=%d IDLE=%f BUSY=%f USER=%f",&pid, &idle, &busy, &user))
{
// found a line that does match this pattern: try again later, the file might be currently written
break;
}
// add here your code processing data
fgetpos (pFile,&pos); // remember current position
pos_init = 1; // position has been initialized
}
fclose(fid);
}
关于c - 解析文本文件的简单方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5211028/