Я написал программу на C, которая создает процесс, который открывает файл .txt
и когда я нажимаю Ctrl + C ], он закроет процесс и распечатает сообщение, но у меня огромная проблема. Созданный мной процесс, когда я его убиваю, не закрывается:
#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
pid_t child_id;
void ctrl_C(int sig){
kill(child_id, 9);
printf("\nYou pressed Ctrl + C,Good Bye \n");
signal(SIGINT, SIG_DFL);
kill(child_id, SIGINT);
}
int main(){
printf("I am Programmer \n");
child_id = fork();
if (child_id == 0) {
execlp("gnome-terminal", "gnome-terminal", "--", "vi", "abcd.txt", NULL);
return 255;
}
signal(SIGINT,ctrl_C);
while (1) {
sleep(1);
}
}
Процесс остается в таблице процессов до вызова wait()
в родительском процессе (это называется "состояние зомби") или до выхода родительского процесса, в этом случае он перенаправляется в systemd (бывший init), который выполняет wait()
для таких осиротевших процессов.
Зомби-процесс фактически умер, но его запись в таблице процессов содержит статистику производительности и будет существовать до тех пор, пока родительский процесс не соберет ее с помощью wait(). Их можно обнаружить с помощью ps -eO stat и поискать в колонке stat вещи с буквой Z. Зомби-процессы не используют никаких системных ресурсов, кроме слота в таблице процессов.