Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 从挂起恢复时出现分段错误_C_Gtk_Segmentation Fault - Fatal编程技术网

C 从挂起恢复时出现分段错误

C 从挂起恢复时出现分段错误,c,gtk,segmentation-fault,C,Gtk,Segmentation Fault,我正在使用GTK编写一个非常简单的电池状态图标。 它是一个GtkStatusIcon,在工具提示中显示当前电池状态。 为了获得电池信息,我分析命令acpi的输出,该命令通常类似于: Battery 0: Discharging, 70%, 01:00:00 remaining 电池0:放电,70%,剩余01:00:00 我的电池状态图标运行正常,但当我挂起电脑然后重新启动时,我的程序因分段错误而崩溃 整个代码如下(我已经对其进行了注释): #包括 #包括 #包括 #包括 #定义默认\u数组\u大

我正在使用GTK编写一个非常简单的电池状态图标。 它是一个GtkStatusIcon,在工具提示中显示当前电池状态。 为了获得电池信息,我分析命令
acpi
的输出,该命令通常类似于: Battery 0: Discharging, 70%, 01:00:00 remaining 电池0:放电,70%,剩余01:00:00

我的电池状态图标运行正常,但当我挂起电脑然后重新启动时,我的程序因分段错误而崩溃

整个代码如下(我已经对其进行了注释):

#包括
#包括
#包括
#包括
#定义默认\u数组\u大小3
#定义默认时间更新5
const gchar*acpi_command=“acpi”;
typedef枚举batteryState{
充电,
卸货,
}电池状态;
typedef结构电池阵列{
GtkStatusIcon*托盘图标;
gchar*工具提示;
gchar*图标;
}电池射线;
typedef结构电池{
gchar*状态;
轧棉率;
gchar*额外;
电池射线电池射线;
BatteryState BatteryState;
}电池;
静态无效更新电池状态(电池*电池);
静态gboolean更新\u状态\u托盘(电池*电池);
静态gchar*获取状态图标名称(电池*电池);
静态无效创建_托盘_图标(电池*电池);
静态无效分析acpi_输出(电池*电池,gchar*acpi_输出);
静态字符*get_acpi_输出(const gchar*acpi_命令);
静态无效更新\电池状态\电池(电池*电池)
{
如果(strcmp(电池->状态,“充电”)==0)
电池->电池状态=充电;
否则如果(strcmp(电池->状态,“放电”)==0)
电池->电池状态=放电;
}
静态gboolean更新\u状态\u托盘(电池*电池)
{
gchar*图标名称=获取状态图标名称(电池);
gchar*acpi\u out=get\u acpi\u输出(acpi\u命令);
解析acpi输出(电池、acpi输出);
更新电池状态(电池);
电池->电池光线.tooltip=g\u strdup\u printf(“%s(%d%%)%s”,
电池->状态,
电池->百分比,
电池->额外);
gtk_状态_图标_设置_工具提示_文本(电池->电池托盘图标,
电池->电池阵列。工具提示);
gtk_状态_图标_设置_来自_图标_名称(电池->电池托盘图标),
图标(名称);
返回TRUE;
}
静态gchar*获取\状态\图标\名称(电池*电池)
{
GString*icon_name=g_string_new(“通知电池”);
如果(电池->百分比<20)
g_字符串_追加(图标_名称,“-low”);
否则如果(电池->百分比<40)
g_字符串_追加(图标名称,“-020”);
否则如果(电池->百分比<80)
g_字符串_追加(图标_名称,“-060”);
其他的
g_字符串_追加(图标名称,“-100”);
如果(电池->电池状态==充电){
g_字符串_追加(图标_名称,“-plucked”);
}
返回图标\u name->str;
}
静态无效创建托盘图标(电池*电池)
{
/*创建gtkstatusicon并调用函数
`每5秒更新_状态_托盘`一次*/
电池->电池托盘图标=gtk\U状态图标\U新建();
电池->电池光线。工具提示=“电池”;
gtk_状态_图标_设置_工具提示(电池->电池托盘图标,
电池->电池阵列。工具提示);
gtk_状态_图标_设置_可见(电池->电池托盘图标,
正确的);
更新托盘(电池)的状态;
g\u超时\u添加\u秒(默认\u时间\u更新,(GSourceFunc)更新\u状态\u托盘,电池);
}
静态无效解析acpi_输出(电池*电池,gchar*acpi_输出)
{
/*acpi输出如下所示:
电池0:放电,70%,剩余01:00:00
在该功能中,我将“放电”指定给电池->状态
70至电池->百分比
和“01:00:00剩余”到电池->额外
我使用strtok将acpi输出拆分为以“,”和“,”分隔的标记
然后,如果令牌前面有一个空白字符“”,我将其“删除”。
*/
ginti=0;
gchar*t;
gchar**值\u数组;
/*在字符串中查找“:”的位置*/
int pos=strchr(acpi_输出“:”)-acpi_输出;
t=strtok(acpi_输出+pos+1,“,”);
值_array=malloc(默认_array_SIZE*sizeof(gchar));
while(t!=NULL){
/*“删除”空白字符*/
值_数组[i++]=t[0]=''t+1:t;
t=strtok(空,“,”);
}
/*删除换行符*/
如果(值数组[2][strlen(值数组[2])-1]=='\n'){
值数组[2][strlen(值数组[2])-1]='\0';
}
电池->状态=值\u数组[0];
电池->百分比=atoi(值_数组[1]);
电池->额外=值_数组[2];
自由值(数组);
}
静态gchar*get\u acpi\u输出(const gchar*acpi\u命令)
{
gchar*输出;
GError*error=NULL;
/*将acpi命令的输出分配给“输出”*/
g_spawn_命令_行_同步(acpi_命令和输出、NULL、NULL和错误);
返回输出;
} 
int main(int argc,字符**argv)
{
电池;
gtk_init(&argc,&argv);
创建托盘图标(电池和电池);
gtk_main();
返回0;
}

我希望有人能帮助我,因为我真的不明白。

有很多地方可以做更多的错误检查;也许在唤醒过程中,代码之外的内容会失败。例如,您不检查
g\u spawn\u command\u line\u sync
的结果——您假设
output
在返回时指向有效字符串,但可能并不总是这样。您假设,但实际上并不确认,您运行的工具的输出中有一定数量的令牌,但可能并不总是如此。

这是大量的代码。至少自己做一些工作——做一个内核转储,用调试器检查它,看看它崩溃时在做什么。