int main() { FILE *fp; while (1) { printf("0"); fp = popen(command, "r"); printf("1"); 不打印 0 1 直接出现段错误
时间: 2024-03-11 15:50:21 浏览: 113
出现段错误的原因可能是因为未定义变量 `command`,在 `popen()` 函数中使用了未初始化的指针,或者在 `popen()` 函数中传递了错误的参数。
另外,你在代码中使用了一个无限循环 `while(1)`,这可能会导致程序陷入死循环,因为没有退出条件。这可能会导致程序的内存耗尽或其他问题。建议在循环中添加退出条件。
你可以尝试打印出 `command` 的值,以确保它被正确地初始化。同时,你还可以检查 `popen()` 函数的返回值是否为 NULL,以确保它已正确地执行。
以下是一个示例代码,可能有助于解决你的问题:
```
#include <stdio.h>
#include <stdlib.h>
int main() {
FILE *fp;
char command[] = "ls -l"; // 假设要执行的命令是 "ls -l"
char buffer[1024];
fp = popen(command, "r");
if (fp == NULL) {
printf("Error running command.\n");
exit(1);
}
while (fgets(buffer, sizeof(buffer), fp) != NULL) {
printf("%s", buffer);
}
pclose(fp);
return 0;
}
```
相关问题
#define MAX_LINE_LENGTH 1024 #define MAX_RECORDS 50 char command[] = "/usr/bin/sn_core.elf getstat 2>/dev/null"; char line[MAX_LINE_LENGTH]; float temp; char *Temp[MAX_RECORDS] = {0}; int index = 0; void parse_temperature(char *line) { char *temp_str; char *token; temp = 0; // 解析温度 if ((temp_str = strstr(line, "temp: ")) != NULL) { temp_str += strlen("temp: "); temp = strtof(temp_str, NULL); } } void add_record(float temp) { if (index >= MAX_RECORDS) { free(Temp[0]); memmove(Temp, Temp + 1, (MAX_RECORDS - 1) * sizeof(float *)); index--; } Temp[index] = malloc(sizeof(float *)); memcpy(Temp[index], &temp, sizeof(float *)); index++; } void print_records() { for (int i = 0; i < index; i++) { printf("温度:%f\n", *((float *)Temp[i])); } } int main() { FILE *fp; while (1) { fp = popen(command, "r"); if(fp = NULL){ printf("Error running command.\n"); exit(1); } while (fgets(line, MAX_LINE_LENGTH, fp) != NULL) { parse_temperature(line); } pclose(fp); add_record(temp); print_records(); sleep(1); } return 0; } 出现段错误
在代码中,有一个错误:在 malloc() 和 memcpy() 调用时,应该传递 sizeof(float) 而不是 sizeof(float *)。因为 Temp 数组是用于存储 float 类型的指针,而不是指向 float 类型的指针的指针,因此应该使用 sizeof(float)。修改这个错误应该可以解决段错误问题。同时,判断 fp 是否为 NULL 的语句应该是 if(fp == NULL),而不是 if(fp = NULL)。
#define MAX_LINE_LENGTH 1024 #define MAX_RECORDS 5 char command[] = "/usr/bin/sn_core.elf getstat 2>/dev/null"; char line[MAX_LINE_LENGTH]; const char *filename = "data.txt"; float temp; char *Temp[MAX_RECORDS] = {0}; int index = 0; void parse_temperature(char *line) { char *temp_str; char *token; // 解析温度 if ((temp_str = strstr(line, "temp: ")) != NULL) { temp_str += strlen("temp: "); temp = strtof(temp_str, NULL); } } void add_record(float temp) { if (index >= MAX_RECORDS) { free(Temp[0]); memmove(Temp, Temp + 1, (MAX_RECORDS - 1) * sizeof(char *)); index--; } Temp[index] = malloc(sizeof(float)); memcpy(Temp[index], &temp, sizeof(float)); index++; } void print_records() { for (int i = 0; i < index; i++) { printf("%f\n", *((float *)Temp[i])); } } int main() { FILE *fp,*fd; while (1) { fp = popen(command, "r"); if(fp == NULL){ printf("Error running command.\n"); exit(1); } fd = fopen(filename,"w"); if(fd == NULL){ printf("Error open file!\n"); exit(1); } while (fgets(line, MAX_LINE_LENGTH, fp) != NULL) { //printf("%s\n",line); parse_temperature(line); } pclose(fp); add_record(temp); //print_records(); sleep(1); } return 0; } 优化代码 并将Temp[]数组里的值写入data.text文本中
以下是对代码的优化,并将Temp[]数组里的值写入data.txt文本中的修改:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#define MAX_LINE_LENGTH 1024
#define MAX_RECORDS 5
char command[] = "/usr/bin/sn_core.elf getstat 2>/dev/null";
char line[MAX_LINE_LENGTH];
const char *filename = "data.txt";
float temp;
float *Temp[MAX_RECORDS] = {0};
int index = 0;
void parse_temperature(char *line) {
char *temp_str;
// 解析温度
if ((temp_str = strstr(line, "temp: ")) != NULL) {
temp_str += strlen("temp: ");
temp = strtof(temp_str, NULL);
}
}
void add_record(float temp) {
if (index >= MAX_RECORDS) {
free(Temp[0]);
memmove(Temp, Temp + 1, (MAX_RECORDS - 1) * sizeof(float *));
index--;
}
Temp[index] = malloc(sizeof(float));
memcpy(Temp[index], &temp, sizeof(float));
index++;
}
void print_records() {
FILE *fd = fopen(filename,"w");
if(fd == NULL){
printf("Error open file!\n");
exit(1);
}
for (int i = 0; i < index; i++) {
fprintf(fd, "%f\n", *(Temp[i]));
}
fclose(fd);
}
int main() {
while (1) {
FILE *fp = popen(command, "r");
if(fp == NULL){
printf("Error running command.\n");
exit(1);
}
while (fgets(line, MAX_LINE_LENGTH, fp) != NULL) {
//printf("%s\n",line);
parse_temperature(line);
}
pclose(fp);
add_record(temp);
print_records();
sleep(1);
}
return 0;
}
```
对代码进行的优化包括:
1. 将Temp数组的类型从`char *`改为`float *`,使其更符合实际存储的数据类型;
2. 将文件操作放在`print_records`函数中进行,使得代码更加模块化和可读性更高;
3. 在打开文件时检查是否成功打开,避免出现文件操作错误导致程序异常退出。
阅读全文