سؤال

النظر في هذا البرنامج لا معنى له:

/* main.c */

#include <stdlib.h>
#include <unistd.h>

int main(int argc, char **argv) {
    int i;
    for (i = 0; i < 1024; i++) {
        int pid = fork();
        int status;
        if (pid) {
            wait(&status);
        }
        else {
            char *ptr = (char *)malloc(1024*sizeof(char));
            char *args[2] = {"Hello, world!", NULL};
            execve("/bin/echo", args, NULL);
        }
    }
}

لن يحرر ptr تشكل تسربًا للذاكرة إما main.c أو البرنامج الآخر ، أم أنه سيتم تحريره على أي حال عندما يتم استدعاء execve؟

هل كانت مفيدة؟

المحلول

رقم.

هذا ليس تسرب الذاكرة. exec*() سيقوم بإنشاء نسخة محلية من بيانات السلسلة في صفيف Args ، ثم تفجير صورة ذاكرة عملية الطفل وتراكبها مع صورة الذاكرة المستخدمة بواسطة /bin/echo. كل ما تبقى بعد exec () هو PID.

يحرر:

قام user318904 بإعداد حالة exec () return -1 (أي ، الفشل). في هذه الحالة ، فإن عملية الطفل التي شربت لكنها فشلت في EXEC ، لديها بالفعل تسرب ذاكرة تقنيًا ، ولكن كرد فعل معتاد على EXEC الفاشل هو الخروج من عملية الطفل على أي حال ، سيتم استرداد الذاكرة من قبل نظام التشغيل. ومع ذلك ، من المحتمل أن يكون التحرير عادةً جيدًا للدخول ، إذا لم يكن هناك سبب آخر غير ذلك ، فهو سيمنعك من التساؤل عنها لاحقًا.

نصائح أخرى

عندما يعود execve -1 ، نعم. خلاف ذلك ، ربما.

يجب تحرير الذاكرة المخصصة exec. بعد اكتمال المكالمة ، لا يمكنك الوصول إليها على أي حال.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top