[英]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.