#c #linux #process #signals #diskspace
Вопрос:
Я создаю следующую программу, которая должна «играть в пинг-понг» между родительским процессом и его дочерним процессом.
Даже работая над ним, во время компиляции, я заметил, что мой компьютер начинает работать все усерднее и усерднее, но на самом деле я не думал, что это проблема.
В конце концов я обнаружил, что разбил свой Linux, создав множество различных процессов, которые замедляют работу ПК, а также создают много временных файлов/журналов и приводят к тому, что на моем диске остается 200 МБ свободного места вместо 35 ГБ .
Как я могу устранить эти проблемы?
- Как я могу запретить своей программе создавать множество различных процессов?
- Как я могу очистить свой каталог журналов? Я попытался
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 ГБ. кроме этого, все остальное кажется нормальным.