С Новым годом! Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/14: Рейтинг темы: голосов - 14, средняя оценка - 4.50
6 / 6 / 0
Регистрация: 28.12.2010
Сообщений: 113
1

Перевод процесса в zombie

01.12.2011, 23:31. Показов 2726. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет Подскажите, пожалуйста, по поводу перевода процесса в zombie
вот есть прога, которая при завершении переходит в состояние zombie.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include<stdio.h>
#include<unistd.h>
#include<wait.h>
 
int main(int argc, char** argv)
{
    pid_t status;
    
    if (argc != 3)
    {
        printf("Invalid number of arguments\n");
        return 1;
    }
 
    status = fork();
    if (status == -1)
    {
        printf("Fork error\n");
        return 1;
    }
 
    // if child
    if (status == 0)
    {
        int i, n;
        n = atoi(argv[2]);
        for (i = 0; i < n; i++)
        {
            status = fork();
            if (status == -1)
            {
                printf("Fork error\n");
                return 1;
            }
 
            // if child
            if (status == 0) 
            {
                execlp(argv[1], "", NULL);
                printf("Exec error\n");
                return 1;
            }
        }
 
        return 0;
    }
    
 
    while(1);
 
    return 0;
}
вопрос мой в следующем: как теперь дополнить эту программу, чтобы в zombie переходила еще та программа, которая порождается(status = fork(); )?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.12.2011, 23:31
Ответы с готовыми решениями:

процесс zombie
Здравствуйте, подвскажите плиз как создать процесc zombie,так чтобы его было видно при вписании ps.

Чтение памяти другого процесса по таймеру: нужно ли закрывать хэндл процесса?
В моём варианте работает так: По таймеру (0,1 сек) определяю ID процесса по ехе-шнику, получаю...

Завершение процесса при обнаружении другого процесса на .bat или .vbs
Будет всегда висеть в системе не закрываясь и смотреть при открытии даже одной из этих программ...

Разработать три процесса: процесс-сервер и два процесса-клиента
Требуется разработать три процесса, запускаемые из командной строки UNIX: процесс-сервер,...

9
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
02.12.2011, 10:44 2
Цитата Сообщение от dan_strong Посмотреть сообщение
while(1);
Это вот так она в zombie уходит? О_о
Если идти тем же методом, то убрать return'ы из кода функционирования чайлда
0
6 / 6 / 0
Регистрация: 28.12.2010
Сообщений: 113
02.12.2011, 15:04  [ТС] 3
ок, а можешь тогда подсказать, как это правильно сделать?
0
6 / 6 / 0
Регистрация: 28.12.2010
Сообщений: 113
03.12.2011, 16:23  [ТС] 4
парни, выручайте!!
0
12 / 12 / 0
Регистрация: 31.10.2011
Сообщений: 35
11.12.2011, 21:55 5
Теория говорит, что процесс становится зомби тогда, когда он завершается, а процесс-родитель не отловил возвращаемое им число. Однако, как только родитель сам завершается, то зомби переходит к init, и тот быстренько расправляется с ним. Вывод: чтобы породить зомби, нужно, чтобы child завершился, а родитель был еще жив. Если нужно временное существование зомби, то ставь в родителе sleep. Если постоянное, то нужно как остановить родителя на веки. while(1) - плохо, потому что будет жрать процессорное время. Что-то типа взаимной блокировки или бесконечного ожидания возврата из операции над каким-то файловым дескриптором.
0
6 / 6 / 0
Регистрация: 28.12.2010
Сообщений: 113
12.12.2011, 00:33  [ТС] 6
вопрос снят)
0
14 / 0 / 1
Регистрация: 11.12.2011
Сообщений: 29
26.12.2011, 00:56 7
а если поставить вопрос по-другому:
есть та же самая прога, но без while(1)
она запускает, к примеру, два процесса
можно ли что-то сделать, чтобы она перешла в zombie?
ведь задача состояит в том, чтобы "запустить программу таким образом, чтобы после завершения она перешла в состояние zombie, а затем уничтожить zombie-процесс из командной строки shell"
0
Заблокирован
26.12.2011, 14:50 8
надо бы сначала разобраться что из себя представляет зомби:
при завершении процесса вызывается одна из терминирующих функций из пользовательского пространства(или напрямую вызвать sys_exit), например exit(), но любая из них в итоге сделает sys_exit, которая делегирует работу do_exit. В ней особенно интересна строка, где вызывается exit_notify, потому что она превратит процесс в зомби
C
1
2
3
4
5
6
7
8
9
10
tsk->exit_state = autoreap ? EXIT_DEAD : EXIT_ZOMBIE;
 857
 858        /* mt-exec, de_thread() is waiting for group leader */
 859        if (unlikely(tsk->signal->notify_count < 0))
 860                wake_up_process(tsk->signal->group_exit_task);
 861        write_unlock_irq(&tasklist_lock);
 862
 863        /* If the process is dead, release it - nobody will wait for it */
 864        if (autoreap)
 865                release_task(tsk);
а для него release_task не происходит, так что процесс ещё жив, хотя от него, кроме task_struct в ядре, практически ничего не осталось, а в ней интересно только поле exit_code.
Памяти он не кушает, файлов открытых нети сигналы он обрабатывать не в состоянии, do_exit об этом позаботилась:
943 exit_signals(tsk);


теперь надо выяснить, что пройзойдёт, если ты всё-таки попытаешься послать сигнал зомби с помощью kill:
как видно из определения kill основную работу делает kill_something_info. В ней управление передаётся этой фунцкции. Ну и далее длинная цепочка вызовов
kill_something_info->kill_pid_info->group_send_sig_info->do_send_sig_info
ну тут собственно и конец
C
1
2
3
4
5
6
7
8
9
10
11
12
13
1174int do_send_sig_info(int sig, struct siginfo *info, struct task_struct *p,
1175                        bool group)
1176{
1177        unsigned long flags;
1178        int ret = -ESRCH;
1179
1180        if (lock_task_sighand(p, &flags)) {
1181                ret = send_signal(sig, info, p, group);
1182                unlock_task_sighand(p, &flags);
1183        }
1184
1185        return ret;
1186}
если в иф не передастся управление то вернётся ESRCH, то есть надо рассмотреть lock_task_sighand, это макрос который в итоге приведёт нас сюда:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
1249struct sighand_struct *__lock_task_sighand(struct task_struct *tsk,
1250                                           unsigned long *flags)
1251{
1252        struct sighand_struct *sighand;
1253
1254        for (;;) {
1255                local_irq_save(*flags);
1256                rcu_read_lock();
1257                sighand = rcu_dereference(tsk->sighand);
1258                if (unlikely(sighand == NULL)) {
1259                        rcu_read_unlock();
1260                        local_irq_restore(*flags);
1261                        break;
1262                }
1263
1264                spin_lock(&sighand->siglock);
1265                if (likely(sighand == tsk->sighand)) {
1266                        rcu_read_unlock();
1267                        break;
1268                }
1269                spin_unlock(&sighand->siglock);
1270                rcu_read_unlock();
1271                local_irq_restore(*flags);
1272        }
1273
1274        return sighand;
1275}
строка 1257 сразу привлекает внимание. Думаю do_exit уже позаботилась о том чтобы удалить всё что связанно с сигналами, так как зомби они не нужны, где это явно происходит я не нашёл, впринципе и не искал, может быть в exit_signals, неохота спускаться ещё раз, поэтому поверю себе на слово. Ну то есть что в итоге: в 1180 вернётся null и вся эта длинная цепочка от do_send_sig_info до kill тогда вернёт ESRCH. Так что если я правильно понял задание somebody11, то оно невыполнимо. Прибить зомби можно либо просто подождав его, либо убить родителя, тогда init_task убьёт зомби, а из командной строки зомби ты не завалишь

Добавлено через 6 минут
не все ссылки не туда куда надо переносят, хотя может это только в опере так, там в адресной строке надо смотреть http://lxr.linux.no/#linux+v3.1.6/kernel/exit.c#L1011 и вручную переходить на 1011 строку если не совпадает
1
13 / 13 / 0
Регистрация: 21.10.2011
Сообщений: 58
29.12.2011, 14:44 9
LosAngeles, спасибо, очень познавательно..

а ты не мог бы провести небольшой аудит моего кода?
http://mbox.fpg.ru/basys/ - это доксиген-документация
начинай копать с файла src/basys.c

сказать, что нравится, что не нравится, дать пару советов, напутствий..
любая помощь пригодится..
0
Заблокирован
31.12.2011, 13:19 10
нет, я воздержусь
0
31.12.2011, 13:19
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.12.2011, 13:19
Помогаю со студенческими работами здесь

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

Как сверить имя процесса и путь основного процесса?
Подскажите как мне сверить путь с именем процесса svchost.exe если файл запущен из папки System32...

Получить id процесса родителя, если исходный id процесса дочерний
Добрый день. У меня есть вот такой код на C#, который должен позволить получить id процесса...

Завершение процесса при обнаружении другого процесса
Здравствуйте. Люди добрые подскажите пожалуйста как мне быть. Есть приложение которое следит за...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru