我试图从文件中读取行,当我在Batch_MODE函数中直接使用getline时,它工作得很好,但当我在一个单独的函数中重构代码时,它给了我一个错误.

int main(int argc, char *argv[]) {
  if (argc > 2)
    return EXIT_FAILURE;

  batch_mode(argv[1]);

  return EXIT_SUCCESS;
}

Batch_MODE函数

void batch_mode(char *path) {
  char *line = NULL;
  ssize_t error = 0;
  char *cmd = NULL;
  FILE *file = fopen(path, "r");

  if (file == NULL) {
    printf("Coudn't read file\n");
    return;
  }

  while (error != -1) {
    read_line(line, file, cmd);
    error = -1;

    int thread = fork();

    if (thread == 0) {
      char *myargs[] = {NULL};

      execv(cmd, myargs);
    } else {
      thread = wait(NULL);
    }
  }

  if (file != NULL)
    fclose(file);
  free(line);
}

lines are read correctly in this function when printf but output null in the Batch_MODE函数

ssize_t read_line(char *line, FILE *file, char *cmd) {
  size_t len = 0;
  ssize_t read = 0;

  read = getline(&line, &len, file);

  printf("%s\n", line);
  if (read == -1) {
    printf("Coudn't read line\n");
    return -1;
  }

  char *copy = line;
  cmd = strsep(&copy, " ");
  printf("%s\n", cmd);

  return 0;
}

当try 此代码时,它输出无法读取文件,因为它正在多次执行

void batch_mode(char *path) {
  char *line = NULL;
  ssize_t error = 0;
  char *cmd = NULL;
  FILE *file = fopen(path, "r");

  if (file == NULL) {
    printf("Coudn't read file\n");
    return;
  }

  while ((error = read_line(line, file, cmd)) != -1) {

    int thread = fork();

    if (thread == 0) {
      char *myargs[] = {NULL};

      execv(cmd, myargs);
    } else {
      thread = wait(NULL);
    }
  }

  if (file != NULL)
    fclose(file);
  free(line);
}

推荐答案

代码至少存在以下问题:

Never frees memory

read = getline(&line, &len, file);将内存分配给line. 代码永远不会释放它.

调用代码的free(line);不是read_line()的更新后的line.

Updating only local copy

cmd = strsep(&copy, " ");不会更新调用代码的cmd.

调用代码的速度是execv(NULL, myargs);


相反,传递指针的地址.也许吧

ssize_t read_line(char **line, FILE *file, char **cmd) {

C++相关问答推荐

当包含头文件时,gcc会发出隐式函数声明警告

正在try 将文件/文件夹名从目录 struct 存储到链接列表

我怎么才能用GCC编译一个c库,让它包含另一个库呢?

CC2538裸机项目编译但不起作用

不同出处的指针可以相等吗?

C I/O:在Windows控制台上处理键盘输入

如何在C++中安全地进行浮点运算

Printf()在C中打印终止字符之后的字符,我该如何解决这个问题?

为什么电路板被循环删除?

GetText不适用于包含国际字符的帐户名称

程序如何解释变量中的值

C中2个数字的加法 - 简单的人类方法

DennisM.Ritchie的C编程语言一书中关于二进制搜索的代码出现错误?

GCC认为这是一个VLA是对的吗?

System V 消息队列由于某种原因定期重置

C/C++编译器可以在编译过程中通过按引用传递来优化按值传递吗?

UEFI 应用程序中的计时器回调仅在 AMI BIOS 中挂起

C23 中的 [[reproducible]] 和 [[unsequenced]] 属性是什么?什么时候应该使用它们?

定义 int a = 0, b = a++, c = a++;在 C 中定义了行为吗?

inline 关键字导致 Clion 中的链接器错误