Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > ввести процесс в состояние зомби


Автор: banich 23.10.2006, 13:36
Есть задание: 
1)Реализовать программу, осуществляющую порождение нескольких процессов, запуск ими некоторой программы, и ожидание их завершения. Число порождаемых процессов и имя программы указывается при запуске.
2)Запустить программу таким образом, чтобы после завершения она перешла в состояние zombie, а затем уничтожить zombie-процесс из командной строки shell.

Собственно, вопрос по второму пункту. Как средствами С можно это все провернуть? Вроде это должно быть связано с сигналами, которые обрабатывают процессы... 

Всем заранее спасибо =)

Автор: Serge 23.10.2006, 14:39
Марк Митчелл "Программирование для Linux. Профессиональный подход" ч. 1, главы 1 - 5. Читать до просветления... ;)

Автор: banich 23.10.2006, 15:25
Не поделишься е-версией на русском, если не сложно?

Автор: MAKCim 23.10.2006, 18:10
Цитата

2)Запустить программу таким образом, чтобы после завершения она перешла в состояние zombie, а затем уничтожить zombie-процесс из командной строки shell.

Если родительский процесс не опросит состояние завершенного дочернего посредством wait[pid/id], то он (child) на время перейдет в состояние зомби. После завершения родительского процесса (точнее в do_exit()) - произойдет смена родителя для всех дочерних процессов (notify_parent()). Этим новым родителем будет либо процесс из группы процессов родителя или init, который периодически вызывает wait[pid/id] для освобождения ресурсов, которые занимают зомби-процессы
Код

...
pid_t pid = fork();

if (pid > 0)
    _exit(0);      /* Завершение родителя */
else if (pid < 0)
    _exit(errno);

/* Тут твоя программа, после ее завершения процесс перейдет в состояние зомби */
...

Цитата

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

Код

void call(int size, char* path) {
    pid_t pid;

    int count = 0;

    while (size--) {
 
        pid = fork();

        if (pid == 0) {

            if (strtok(path, "/") == NULL)
                execlp(path, path, NULL);

            execl(path, path, NULL);
        }
        else if (pid > 0) ++count;
    }
    while (count--) waitpid(-1, NULL, 0);
}

int main(int argc, char* argv[]) {
    if (argc != 3) return 1;

    int size = atoi(argv[1]);      /* Количество */
    char* path = argv[2];         /* Программа */

    call(size, path);

    return 0;
}

Автор: banich 24.10.2006, 17:13
MAKCim, , большое спасибо за подробности smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)