我正在制作负载均衡器(非常简单)。它会查看用户空闲的时间,以及系统上的负载,以确定进程是否可以运行,并以循环方式遍历进程。
控制进程所需的所有数据都存储在文本文件中。 该文件可能如下所示:
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
这是一项大学任务,但解析文本文件不应该是它的重要部分,这意味着我可以使用任何最快的方式来实现。
此流程中的条目将在流程完成时添加或删除,或者在控制下添加。
有关如何解析此问题的任何想法?
感谢。
答案 0 :(得分:1)
就解析而言,在循环中是这样的:
int pid;
float idle, busy, user;
if(fscanf(inputStream, "PID=%d IDLE=%f BUSY=%f USER=%f", %pid, &idle, &busy, &user)!=4)
{
/* handle the error */
}
但是正如@Blrfl指出的那样,最大的问题是当你的应用程序正在读取文件而其他人正在写入文件时避免混淆。要解决这个问题,你应该使用锁或类似的东西;见例如flock
系统调用。
答案 1 :(得分:1)
这是一个代码,它将解析您的文件,并说明您的文件可能不可用(即fopen
可能失败)或在您阅读时写入的事实(即{ {1}}可能会失败)。请注意,您可能不想使用无限循环(这比在项目中复制粘贴的实际代码更多的伪代码,我没有尝试运行它)。另请注意,考虑到睡眠的持续时间,它可能会非常慢:您可能想要使用更高级的方法,这更像是一种黑客攻击。
fscanf
答案 2 :(得分:0)
在循环中使用fscanf。这是关于使用fscanf的GNU C教程。
/* fscanf example */
#include <stdio.h>
typedef struct lbCfgData {
int pid;
double idle;
double busy;
double user;
} lbCfgData_t ;
int main ()
{
// PID=4390 IDLE=0.000000 BUSY=2.000000 USER=2.000000
lbCfgData_t cfgData[128];
FILE *f;
f = fopen ("myfile.txt","rw+");
for ( int i = 0;
i != 128 // Make sure we don't overflow the array
&& fscanf(f, "PID=%u IDLE=%f BUSY=%f USER=%f", &cfgData[i].pid,
&cfgData[i].idle, &cfgData[i].busy, cfgData[i].user ) != EOF;
i++
);
fclose (f);
return 0;
}