segmentation-fault - fscanf 后 pclose 时出现分段错误
问题描述
我尝试获取丢失的数据包编号(来自覆盆子上的 ping 命令),用于在路由器上进行 sim 切换。我试图用底部的代码来做到这一点(减少到导致错误的部分),但是当我尝试释放(pclose)缓冲区时,我得到了分段错误。我试过 valgrind,我得到了这个:
在 0x490FBE0 读取大小为 4 的无效:fclose@@GLIBC_2.4 (iofclose.c:53) 地址 0x382e3820 未堆栈、malloc 或(最近)释放进程以信号 11(SIGSEGV)的默认操作终止访问不在地址 0x382E3820 的映射区域内
我想我错过了 fscanf 但我不知道如何(我得到 printf 结果并且它是正确的 - 4)。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include "params.h"
#include <pthread.h>
void *pingOnly(void *vargp){
FILE *cmd;
int packetsReceived=0;
while(1){
cmd = popen("sudo ping 8.8.8.8 -c 4 -q","r");
fscanf(cmd, "%[^,], %d", &packetsReceived);
printf("%d\n", packetsReceived);
pclose(cmd);
if(packetsReceived<3){
//testSpeed();
}
sleep(300);
}
return NULL;
}
int main( int argc, char *argv[] )
{
pthread_t thread_id[3];
pthread_create(&thread_id[2], NULL, pingOnly, NULL);
pthread_join(thread_id[2], NULL);
return 0;
}
解决方案
问题是这条线
fscanf(cmd, "%[^,], %d", &packetsReceived);
它试图将字符串读入int packetsReceived
并运行到未定义的行为中,从而破坏堆栈。你可能打算做
fscanf(cmd, "%*[^,], %d", &packetsReceived);
推荐阅读
- javascript - V-model 不会在复选框列表更改时更新
- numpy - 将 Tensorflow 张量转换为 Numpyarray
- typescript - 如果用作 Vue3 插件,则不能在 TypeScript 类中使用私有属性
- azure - 获取uri GET方法的响应载荷
- php - 同一模型中的多对多
- c# - 发出请求时出错:请求被中止:无法创建 SSL/TLS 安全通道
- python - 如何将 Matplotlib 创建的 png 文件发送到 Telegram bot
- python - 什么是气流运算符中的上下文变量
- git - 清理提交历史但保留一些提交
- android - 安卓。通过电话号码从通讯录中检索名字和姓氏