Моя программа создала так много процессов и разбила операционную систему, как это решить?

#c #linux #process #signals #diskspace

Вопрос:

Я создаю следующую программу, которая должна «играть в пинг-понг» между родительским процессом и его дочерним процессом.

Даже работая над ним, во время компиляции, я заметил, что мой компьютер начинает работать все усерднее и усерднее, но на самом деле я не думал, что это проблема.

В конце концов я обнаружил, что разбил свой Linux, создав множество различных процессов, которые замедляют работу ПК, а также создают много временных файлов/журналов и приводят к тому, что на моем диске остается 200 МБ свободного места вместо 35 ГБ .

Как я могу устранить эти проблемы?

  1. Как я могу запретить своей программе создавать множество различных процессов?
  2. Как я могу очистить свой каталог журналов? Я попытался sudo apt autoremove и autoclean и удалить все .gz файлы в /var/log каталоге.

Но это не помогло. Мое дисковое пространство по-прежнему занимает 200 МБ свободного места, а /var/log каталог по какой-то причине составляет почти 40 ГБ.

Я не хочу удалять необходимые файлы, которые находятся в /var/log каталоге, поэтому я не удаляю весь каталог.

Почему моя программа даже создала так много временных файлов или журналов?

Спасибо.

  /******************************** Header Files ********************************/
    
    #define _GNU_SOURCE 
    
    #include <signal.h>
    #include <stdio.h>      /*  printf                          */
    #include <stdlib.h>     /*  exit                            */
    #include <unistd.h>     /*  fork, getpid, sleep             */
    
    /**************************** Forward Declarations ****************************/
    
    /*  exits the program with the given 'ret status' if 'is_bad' is true       */
    void ExitIfBad(int is_bad, char *msg_to_print, int ret_stat);
    
    void handle_siguser1(int signal_id);
    
    void handle_siguser2(int signal_id);
    
    enum {CHILD = 0};
    
    static int is_parent_turn = 1;
    
    /************************* Functions  Implementations *************************/
    int main()
    {
        /*  create a child process  */
        pid_t pid = fork();
        
        ExitIfBad(pid < 0, "Error: Could not create a processn", 1);
        
        signal(SIGUSR1, handle_siguser1);
        signal(SIGUSR2, handle_siguser2);
        
        /*  returned to the newly created child process. */
        if (CHILD == pid)
        {   
            while (1)
            {
                /*  pause child process and let parent to begin */
                sleep(2);
                
                kill(getppid(), SIGUSR2);
                
            }
        }
            
        /* returned to parent */
        else
        {   
            while (1)
            {
                kill(getpid(), SIGUSR1);
            }
        }
            
        return 0;   
    }
    /******************************************************************************/
    void handle_siguser1(int signum)
    {
        if (is_parent_turn)
        {
            printf("nnPINGnn");
            is_parent_turn = 0;
        }
        
        else
        {
            sleep(2);
        }
    }
    /******************************************************************************/
    void handle_siguser2(int signum)
    {
        if (!is_parent_turn)
        {
            printf("nnPONGnn");
            is_parent_turn = 1;
        }
        
        else
        {
            sleep(2);
        }
    }
    /******************************************************************************/
    void ExitIfBad(int is_bad, char *msg_to_print, int ret_stat)
    {
        if (is_bad)
        {
            puts(msg_to_print);
            exit(ret_stat);
        }
    }
    /******************************************************************************/
 

введите описание изображения здесь

введите описание изображения здесь

Комментарии:

1. Хотя sleep он помечен как безопасный для сигналов, пожалуйста, не спите внутри обработчика сигналов, так как они, как правило, должны быть быстрыми. С другой стороны printf , сигнал небезопасен . См signal-safety . страницу руководства .

2. @Someprogrammerdude, что означает printf , что это может вызвать наводнение памяти??

3. но как насчет всех 40 ГБ неизвестных данных, которые были добавлены в /var/log каталог, что я должен с ними делать? Как я могу удалить его, не повредив важные системные файлы?

4. Вы проверили файлы журналов, чтобы узнать, что занимает так много места? И код, который вы показываете, не может разбомбить вашу систему ps , как это выглядит на выходе. Если только где-то нет чего-то, что вы забыли нам показать.

5. @Someprogrammerdude нет, другого выхода нет. вот и вся программа. только этот код. и да, я проверил var/log каталог и обнаружил файл с именем syslog 30 ГБ. кроме этого, все остальное кажется нормальным.