The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Как вернуться из дочернего процесса"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"Как вернуться из дочернего процесса"  
Сообщение от Finger (ok) on 14-Окт-07, 00:27 
Будьте добры, подскажите мне пожалуйста. У меня вопрос: есть прога на С, она должна запускать другую. Я делаю execv,но есть проблема. После того, как отработала прога, которую я вызвал с помощью execv управление не вернулось родительскому процессу. Оно не должно возращаться - это я знаю, но подскажите пожалуйста, как же мне все-таки выполнить другую прогу и вернуться обратно в родительский процесс. Заранее благодарен.
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

 Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Как вернуться из дочернего процесса"  
Сообщение от ws email(ok) on 14-Окт-07, 01:21 
>Будьте добры, подскажите мне пожалуйста. У меня вопрос: есть прога на С,
>она должна запускать другую. Я делаю execv,но есть проблема. После того,
>как отработала прога, которую я вызвал с помощью execv управление не
>вернулось родительскому процессу. Оно не должно возращаться - это я знаю,
>но подскажите пожалуйста, как же мне все-таки выполнить другую прогу и
>вернуться обратно в родительский процесс. Заранее благодарен.

В родительском процессе ожидаешь c помощью wait() завершения дочернего.
Если надо еще и данные передать, то для этого есть межпроцессные средства связи -
пайпы, семафоры, разделяемая память...

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

2. "Как вернуться из дочернего процесса"  
Сообщение от jd (??) on 14-Окт-07, 05:16 
execv не порождает дочерний процесс, а замещает текущий процесс новым. Для порождения дочернего процесса нужно вызвать fork(2), а уже потом (в вашем случае), в дочернем процессе - execv. Ну а в родительском, как сказали выше, вызывать wait(2) или ещё как-то обрабатывать завершение дочернего процесса - по обстоятельствам.
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

3. "Как вернуться из дочернего процесса"  
Сообщение от Finger (ok) on 14-Окт-07, 15:43 
>Для порождения дочернего процесса нужно вызвать fork(2), а уже потом (в вашем случае),
>в дочернем процессе - execv.

Насколько понял мой слабый моск, в исходнике писать так: fork();execv(...);wait(); после этого когда завершится дочерний процесс выполнение продолжится с оператора после wait();
??


Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

4. "Как вернуться из дочернего процесса"  
Сообщение от jd (??) on 14-Окт-07, 18:43 
Нет, не так. Надо читать маны, там всё описано подробно. Ещё лучше почитать какую-нибудь документацию на тему процессов в UNIX вообще - её предостаточно в сети (включая этот сайт).

Но вам, думаю, лучше будет просто воспользоваться функцией system(3). Она сама сделает всё необходимое. Это самый простой способ выполнить другую программу.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

5. "Как вернуться из дочернего процесса"  
Сообщение от Finger (ok) on 14-Окт-07, 20:58 
ОГРОМНЕЙШЕЕ СПАСИБО!!!! Теперь все работает. Очень помогли. Все-таки мир не без добрых людей. Еще раз спасибо!!!
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

6. "Как вернуться из дочернего процесса"  
Сообщение от angra (ok) on 15-Окт-07, 15:01 
>Насколько понял мой слабый моск, в исходнике писать так: fork();execv(...);wait(); после этого
>когда завершится дочерний процесс выполнение продолжится с оператора после wait();
>??

в момент fork вместо одного процесса у тебя появляются два почти(детали в man fork) идентичных процесса, выполнение каждого из них продолжиться на инструкции следующей за fork.  Процесс должен сам понять является он потомком или родителем. Делается это на основе проверки значения fork. Для родителя вернется PID потомка, а для потомка 0. Итого код должен быть примерно таким
pid=fork();
if pid==0 {
делаем действия характерные для потомка, например exec
} else {
делаем действия характерные для родителя, не забываем про wait или waitpid
}


Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

7. "Как вернуться из дочернего процесса"  
Сообщение от phpcoder email(??) on 18-Окт-07, 11:12 
[...]
>pid=fork();
>if pid==0 {
> делаем действия характерные для потомка, например exec
>} else {
> делаем действия характерные для родителя, не забываем про wait или waitpid

... и обработку ошибок ;-)

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру