我正在运行一个收集系统信息的应用程序。不同种类的数据(例如cpu util、temp、mem.util等)。这是作为python3脚本实现的。我正在用C函数从传感器读取功率数据,该函数从INA设备读取数据。我使用一个共享库从python调用函数,并将数据作为结构获取。在循环中运行脚本一段时间后,我得到: 程序接收信号SIGSEGV,分段故障。 /lib/libc.so.6中fread()中的0x00000020001ef3fc 在Python脚本中,我有
def wrap_function(lib, funcname, restype, argtypes):
func = lib.__getattr__(funcname)
func.restype = restype
func.argtypes = argtypes
return func
class Power(ctypes.Structure):
_fields_ = [('p1', ctypes.c_float), ('p2', ctypes.c_float), ('p3', ctypes.c_float), ('p4', ctypes.c_float)]
def __repr__(self):
return '({0}, {1}, {2}, {3})'.format(self.p1, self.p2, self.p3, self.p4)
run_bm = wrap_function(libc_power, 'run_bm', Power, [ctypes.c_int,ctypes.c_int,ctypes.c_int,ctypes.c_int])
power = run_bm(0,1,0,0)
在C程序中我有
void populate_ina_array(ina *inas) {
DIR *d;
struct dirent *dir;
volatile char buffer[10];
char fname_buff[1000];
FILE *fptr;
d = opendir("/sys/class/hwmon/");
int counter = 0;
while ((dir = readdir(d)) != NULL) {
if (strncmp(".", dir->d_name, 1) == 0) {
continue;
}
//printf("tree: %s\n", dir->d_name);
strcpy(fname_buff, "/sys/class/hwmon/");
strcat(fname_buff, dir->d_name);
strcat(fname_buff, "/name");
//printf("name: %s\n", fname_buff);
fptr = fopen(fname_buff, "r");
fread(&buffer, 10, 1, fptr);
//printf("device type: %s", buffer);
if (strncmp(buffer, "ina", 3) == 0) {
fname_buff[strlen(fname_buff)-5] = 0;
strcpy(inas[counter].current_path,fname_buff);
strcat(inas[counter].current_path,"/curr1_input");
strcpy(inas[counter].voltage_path,fname_buff);
strcat(inas[counter].voltage_path,"/in1_input");
// printf("found: %s\n", inas[counter].ina_dir);
inas[counter].last = 0;
counter++;
}
}
qsort(inas, counter, sizeof(ina), cmp_ina);
if (counter > 0)
inas[counter-1].last = 1;
counter = 0;
while(1) {
sprintf(inas[counter].name, railname_arr[counter]);
if(inas[counter].last == 1)
return;
counter++;
}
closedir(d);
}
typedef struct Power {
float power1;
float power2;
float power3;
float power4;
} Power;
struct Power run_bm (int sleep_per, int iterations, int verbose, int display) {
FILE *sav_ptr;
FILE *ina_ptr;
ina inas[30];
populate_ina_array(inas);
Power x;
char buffer[20];
float plpower = 0;
float pspower = 0;
float mgtpower = 0;
int counter = 0;
while(1) {
if (verbose == 1) {
// fprintf(sav_ptr, "%s mV,%s mA,", inas[counter].name, inas[counter].name);
}
if(inas[counter].last == 1)
break;
counter++;
}
if (verbose == 1) {
// fprintf(sav_ptr, "\n");
}
for (int j = 0; j < iterations; j++) {
counter = 0;
while(1) {
ina_ptr = fopen(inas[counter].voltage_path, "r");
fscanf(ina_ptr,"%[^\n]", buffer);
inas[counter].voltage = atoi(buffer);
if(verbose==1) {
// printf("Voltage # %d = %d \n", counter, atoi(buffer));
// fprintf(sav_ptr, "%s,", buffer);
}
fclose(ina_ptr);
ina_ptr = fopen(inas[counter].current_path, "r");
fscanf(ina_ptr,"%[^\n]", buffer);
inas[counter].current = atoi(buffer);
if(verbose==1) {
// printf("Current # %d = %d \n", counter, atoi(buffer));
// fprintf(sav_ptr, "%s,", buffer);
}
if(inas[counter].last) {
if(verbose==1){
}
if (j == 0){
if(display==1){
printf("PS Power, PL Power, MGT Power, Total Power\n");
}
}
pspower = (float) (inas[VCCPSINTFP].voltage*inas[VCCPSINTFP].current+
inas[VCCINTLP].voltage*inas[VCCINTLP].current+
inas[VCCPSAUX].voltage*inas[VCCPSAUX].current+
inas[VCCPSPLL].voltage*inas[VCCPSPLL].current+
inas[VCCPSDDR].voltage*inas[VCCPSDDR].current+
inas[VCCPSDDRPLL].voltage*inas[VCCPSDDRPLL].current)/1000000.0;
if(display==1){
printf(" %.3f,", pspower);
}
plpower = (float) (inas[VCCINT].voltage*inas[VCCINT].current+
inas[VCCBRAM].voltage*inas[VCCBRAM].current+
inas[VCCAUX].voltage*inas[VCCAUX].current+
inas[VCC1V2].voltage*inas[VCC1V2].current+
inas[VCC3V3].voltage*inas[VCC3V3].current)/1000000.0;
if(display==1){
printf(" %.3f,", plpower);
}
mgtpower = (float) (inas[MGTRAVCC].voltage*inas[MGTRAVCC].current+
inas[MGTRAVTT].voltage*inas[MGTRAVTT].current+
inas[MGTAVCC].voltage*inas[MGTAVCC].current+
inas[MGTAVTT].voltage*inas[MGTAVTT].current+
inas[VCC3V3].voltage*inas[VCC3V3].current)/1000000.0;
x.power1 = pspower;
x.power2 = plpower;
x.power3 = mgtpower;
x.power4 = pspower + plpower + mgtpower;
if(display==1){
printf(" %.3f,", mgtpower);
}
if(display==1){
printf(" %.3f\n", mgtpower+plpower+pspower);
}
fclose(ina_ptr);
break;
}
fclose(ina_ptr);
counter++;
}
sleep(sleep_per);
}
return x;
}
知道为什么运行一段时间后会出现故障吗? 多谢各位
目前没有回答
相关问题 更多 >
编程相关推荐