Операции над дочерними процессами C

Я хочу создать программу, которая:

  1. Создавать дочерние процессы
  2. Список всех дочерних процессов
  3. Прочитайте PID, чтобы убить один из дочерних процессов
  4. Снова перечислите все дочерние процессы.

Мой код:

#include <sys/types.h> 
#include <unistd.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <sys/wait.h> 
#include <string.h>

int main(void) {
    int c = 0;
    printf("How many: ");
    scanf("%d", & c);

    int i = 0;

    for (i = 1; i <= c; i++) {
        pid_t pid = fork();

        if (pid == 0) {
            exit(0);
        }
    }

    ListOfChildren();
    int t;
    printf("Kill child: ");
    scanf("%d", & t);

    char test[50];
    snprintf(test, sizeof(test), "kill -15 %d", t);
    system(test);
    ListOfChildren();
    return 1;

}

int ListOfChildren() {
    char str[50] = "ps -o pid --ppid ";
    char ppid[7];
    sprintf(ppid, "%d", getpid());
    strcat(str, ppid);
    system(str);
    return 1;
}

Он создает некоторые процессы, но последний процесс не существует? И я не могу убить ни одного... И почему он показывает 4 процесса, когда я хочу 3?


person Enteee    schedule 12.12.2015    source источник


Ответы (2)


Потому что при форке ваши дети сразу выходят, это скорее всего они уже мертвы, когда вы пытаетесь их убить (вероятно, не обязательно, это зависит от планировщика). То же самое для листинга: процессы, которые вы видите, — это некоторые из оставшихся процессов, которые еще не завершены, и сам процесс «ps», созданный вашим первым процессом.

person Ottunger    schedule 12.12.2015
comment
так что я могу сделать, чтобы сделать это правильно? - person Enteee; 12.12.2015

Чтобы ответить на ваш первый вопрос

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

http://linux.die.net/man/3/system

Что касается второго вопроса, действительно, ваши дочерние процессы завершили выполнение и стали недействующими процессами. вы можете проверить их в своей программе, выполнив

ps -ef | grep defunct

прежде чем ввести какой-либо вариант из «Убить ребенка:». Затем вы увидите, что дочерние процессы, которые вы разветвили в программе, больше не существуют.

Причина, по которой они перестали существовать,

Родительский процесс должен явно принять к сведению кончину дочернего процесса, используя системный вызов wait().

http://en.linuxreviews.org/Defunct_process

Вы не можете убить их обычным способом

kill -9 pid

Поэтому "убить" у вас не получится.

person Nuetrino    schedule 12.12.2015