簡體   English   中英

作為參數發送到后台子進程的可用內存

[英]Free memory that sent to background child process as argument

我有一個練習-實現簡單的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指針創建后台進程是否正確。

提前致謝! 對不起,我英語不好...

你所做的是正確的。

在子進程中,在execvp() ,其內存映像將被新程序替換,因此您無需在其中調用free() 但是,您仍然需要像在示例代碼中那樣在父進程中調用free()

實際上,由於父級和子級是不同的進程,您可以將toSend定義為本地緩沖區,而不是動態為其分配內存。

free(toSend)只會使用它釋放地址。首先,free(toSend [0])將釋放使用第一個地址分配的所有地址,直到遇到未由toSend指針分配的地址。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM