释放到后台子进程的可用内存作为参数

时间:2014-04-14 05:24:40

标签: c memory-management operating-system

我有一个练习 - 实现简单的shell。 由于我必须实现后台运算符('&'),所以当它们在缓冲区上时我不能发送参数(因为新进程可能在下一个命令之后继续运行并且缓冲区被覆盖)。我为每个arg列表分配内存,因为进程是后台而我不等他,我不知道何时释放内存。

我应该怎么做?

演示(没有缓冲):

int main(){
  char **toSend = malloc(sizeof(char*) * 3 );
  toSend[0] = malloc(sizeof(char) * 3);
  strcpy(toSend[0], "ls");
  toSend[1] = malloc(sizeof(char) * 3);
  strcpy(toSend[1], "-a");
  toSend[2] = NULL;
  if( !fork() ){
    int devNull = open("/dev/null", O_WRONLY);
    dup2(devNull, STDOUT_FILENO);
    close(devNull);
    execvp(toSend[0], toSend);
  }
  free(toSend[0]); //???
  free(toSend[1]); //???
  free(toSend);    //???
  return EXIT_SUCCESS;
}  

顺便说一句,我很高兴知道使用devNull指针创建后台进程是否正确。

提前致谢!抱歉我的英语不好......

2 个答案:

答案 0 :(得分:2)

你所做的是正确的。

在子进程中,在execvp()之后,其内存映像将被新程序替换,因此您无需在其中调用free()。但您仍需要在父进程中调用free(),就像在示例代码中所做的那样。

实际上,因为父和子是不同的进程,所以可以将toSend定义为本地缓冲区,而不是动态地为它分配内存。

答案 1 :(得分:0)

free(toSend)将释放该地址。首先释放(toSend [0])释放使用第一个地址分配的所有地址,直到它遇到未被toSend指针分配的地址。