fscanf 后 pclose 时出现分段错误
Segmentation fault when pclose after fscanf
我尝试获取丢失的数据包数(从树莓派上的 ping 命令),我将其用于路由器上的 sim 切换。我试图用底部的代码来做到这一点(减少到导致错误的部分),但是当我尝试释放(pclose)缓冲区时,我遇到了分段错误。我试过 valgrind,我得到了这个:
大小 4 的读取无效
在 0x490FBE0: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);
我尝试获取丢失的数据包数(从树莓派上的 ping 命令),我将其用于路由器上的 sim 切换。我试图用底部的代码来做到这一点(减少到导致错误的部分),但是当我尝试释放(pclose)缓冲区时,我遇到了分段错误。我试过 valgrind,我得到了这个:
大小 4 的读取无效 在 0x490FBE0: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);