使用ctypes读取传感器数据时python脚本中的分段错误

2024-10-17 06:29:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在运行一个收集系统信息的应用程序。不同种类的数据(例如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;
}

知道为什么运行一段时间后会出现故障吗? 多谢各位


Tags: ifbuffercountercurrentfloatctypesfnamebuff