Доброе время!
Переделываю программу на С (юзаю FreeBSD 4.5)
Из программы надо запустить другое приложение.
Незнаю как это сделать :(
Самое печальное, даже не представляю где об этом можно почитать :((
Люди добрые, помогите глупому ...
пожалуйста.
man exec
?
>man exec
>?
видел, смутило то, что это builtin shell commands.
Разве компилятор их съест?
man 3 exec =)
функции execl, execlp, execle, exect, execv, execvp - execute a file
>man 3 exec =)
>функции execl, execlp, execle, exect, execv, execvp - execute a fileпопробывал.
результ немного не понятен.
В первой программе (та которая вызывает) применил execv.
Вызываемая программа действительно отрабатывает, но первая закрывается со словами cmd read returned 0, expecting 5
Что-то видимо не так.
смущает фраза в man'e
The exec family of functions replaces the current process image with a
new process image.
Получается, что новый процесс замещает старый, а мне бы что бы старый продолжал работать.
Как это можно сделать?
если совсем просто, но небезопасно, то man system.
Если хоть какая-то безопасность все-таки нужна, то все те же exec функции, только перед их вызовом делать fork и уже в рожденном детишке exec.>Получается, что новый процесс замещает старый, а мне бы что бы старый
>продолжал работать.
>Как это можно сделать?
>если совсем просто, но небезопасно, то man system.
>Если хоть какая-то безопасность все-таки нужна, то все те же exec функции,
>только перед их вызовом делать fork и уже в рожденном детишке
>exec.
>
>>Получается, что новый процесс замещает старый, а мне бы что бы старый
>>продолжал работать.
>>Как это можно сделать?есть такая функция system() если ее использовать то после выполнения нового процесса старый продолжит выполнятся.
В UNIX'ах для запуска процессов используется связка fork-exec.
сначала fork - создает копию родительского процесса и эта копия делает exec и замещает свой код.
Про это во всех книжках написано. :) Лучше почитай. Там есть ньюансы. Читать лучше Робачевского ("книга с черепашкой" - у нас на кафедре уже легендарна :))
Спасибо всем.
Все получилось, мне вполне хватило system.
Еще раз спасибо.
>Доброе время!
>Переделываю программу на С (юзаю FreeBSD 4.5)
>Из программы надо запустить другое приложение.
>Незнаю как это сделать :(
>Самое печальное, даже не представляю где об этом можно почитать :((
>Люди добрые, помогите глупому ...
>пожалуйста.Народ, а подскажите плиз как реализовать вариант использования fork() под OpenVMS for Alpha, очень надо. Примеры если можно, хочется сразу отметить, что под эту ОС я нашел только функцию v_fork(), но работают они по разному из-за специфики самой ОС. А можно ли все таки, в исходниках Apache ничего не нашел, может кто подскажет.
Привет!>Народ, а подскажите плиз как реализовать вариант использования fork() под OpenVMS for
>Alpha, очень надо. Примеры если можно, хочется сразу отметить, что под
>эту ОС я нашел только функцию v_fork(), но работают они по
>разному из-за специфики самой ОС. А можно ли все таки, в
>исходниках Apache ничего не нашел, может кто подскажет.
Аналога forka() нету в VMS-е если не считать vfork(), есть несколько вариантов порождения процесса или подпроцесса, скажите общие потребности - я присоветую.
>Привет!
>
>>Народ, а подскажите плиз как реализовать вариант использования fork() под OpenVMS for
>>Alpha, очень надо. Примеры если можно, хочется сразу отметить, что под
>>эту ОС я нашел только функцию v_fork(), но работают они по
>>разному из-за специфики самой ОС. А можно ли все таки, в
>>исходниках Apache ничего не нашел, может кто подскажет.
> Аналога forka() нету в VMS-е если не считать vfork(), есть несколько
>вариантов порождения процесса или подпроцесса, скажите общие потребности - я присоветую.
>Есть программа обычная, использующая fork(). Значит fork нет?
Дело все в том, что в просторах инета я нашел аналог fork(), через реализацию posix threads.Так же хотелось бы узнать ваше мнение по поводу
этой статьиhttp://kuhub.cc.ku.edu/www/html/721final/6537/6537pro_009.html
Раздел 3.9.2 SYS$POSIX_FORK_CONTROL System ServiceПотом нашел еще вот эту статью
http://www.opus1.com/vmsdoc/progtool/cpqc64/5763p022.htm
в которой расказывается, что можно использовать pipe для обмена данными.Также кажется есть еще один аналог
http://h71000.www7.hp.com/doc/73final/6493/6101pro_013.html
используя pthread_atforkВ последней и кажется в первой статье речь идет все таки об использовании POSIX fork(). Но тогда, что надо поставить, чтобы этот fork() при сборке программы нашелся? И к чему тогда первая статья.
Конечно, понятно, что можно сделать сначала vfork, как я понял подгатавливает место для будущего процесса, а потом запихиваешь через exec туда другой.
Интересно, конечно было бы ваше мнение все таки по статьям.
>Есть программа обычная, использующая fork(). Значит fork нет?
Нет.>Дело все в том, что в просторах инета я нашел аналог fork(),
>через реализацию posix threads.
http://starlet.deltatel.ru/disk$axpdocsep001/opsys/vmsos721/6493/6101pro_013.html#pt_atfork
This routine is for DIGITAL UNIX systems only.>Интересно, конечно было бы ваше мнение все таки по статьям.
Честно говоря, мне хотелось бы понять первичную цель. Механического порта кода с fork-ом не получиться, это очевидно. Под OpenVMS 7.0 и выше можно пользовать для простоты PIPE(s) - это метод грубый и обычно не пользуется VMS-никами, однако для униходиов може быть единственно понятным. Это порождение подпроцесса с DCL и выдача команд в поток, и получения в зад потока вывода.Что вам-то требуется?
Спасибо, что просветили по поводу потоков. Я не мог понять для OpenVMS они или для DEC-овского UNIX-a. Кстати, потоки поддерживаются в OpenVMS? хотя бы в 7.3?Проблема конечно не моя, но меня очень интересует, как она понимается или решается в рамках VMS (кажется, решили ее как раз именно так, через dcl скрипт). Программа была простая, делался fork, один слушал интернет, а другой пинговал интернет. На другой vms запускался такой же процесс и все. Получался обмен данными. 2x2.требовалось лишь только иметь один общий настроечный файл, но ведь никто не мешает процессу потомку прочитать его снова. Насколько я знаю, в обычном fork общими остаются открытые дексрипторы файлов и потоки ввода/вывода/ошибок, а также все присоединенные общие сегменты памяти (shmop).
>>Интересно, конечно было бы ваше мнение все таки по статьям.
> Честно говоря, мне хотелось бы понять первичную цель. Механического порта кодаДа, я все таил надежду, что можно извратиться как нить и опля, все хорошо.
Насколько я понял это невозможно из-за архитектурных особенностей?
>с fork-ом не получиться, это очевидно. Под OpenVMS 7.0 и выше
>можно пользовать для простоты PIPE(s) - это метод грубый и обычно
>не пользуется VMS-никами, однако для униходиов може быть единственно понятным. Это
>порождение подпроцесса с DCL и выдача команд в поток, и получения
>в зад потока вывода.
>
> Что вам-то требуется?А какой способ обычно используется инженерами VMS, если к примеру мне надо иметь общие данные между двумя процессами, запущенными одновременно, например структуру и достаточно интенсивное межпроцессное взаимодействие. Я в том смысле, что есть два потока-процесса, водном из которых слушается инет, а во втором запихиваются данные в инет должны реализовать некий протокол обена данными, т.е. пересылка данных в одном потоке-процессе, зависят от принятия некоторого сигнального пакета в другом процесс-потоке.
Все не расжевывайте, доки в инет полно, просто основной концепции достаточно, с указанием названий функций.
С уважением Александр.
>Спасибо, что просветили по поводу потоков. Я не мог понять для OpenVMS
>они или для DEC-овского UNIX-a. Кстати, потоки поддерживаются в OpenVMS?
>хотя бы в 7.3?
Потоки в смысле thread-ы? Да, естественно. Начиная с 6.1.Если речь идет о буквальном "пинге" то имеет смысл использовать AST-процедуру для приема и обработки принятых пакетов, в основном же цикеле посылать оные пакеты.
>>>Интересно, конечно было бы ваше мнение все таки по статьям.
>> Честно говоря, мне хотелось бы понять первичную цель. Механического порта кода
>
>Да, я все таил надежду, что можно извратиться как нить и опля,
>все хорошо.
Нет, и слава богу.>Насколько я понял это невозможно из-за архитектурных особенностей?
Да, отчасти, но скорее от из-за различия в "дисциплинах и культурах программирования".
>А какой способ обычно используется инженерами VMS, если к примеру мне надо
>иметь общие данные между двумя процессами, запущенными одновременно, например структуру и
>достаточно интенсивное межпроцессное взаимодействие. Я в том смысле, что есть два
>потока-процесса, водном из которых слушается инет, а во втором запихиваются данные
>в инет должны реализовать некий протокол обена данными, т.е. пересылка данных
>в одном потоке-процессе, зависят от принятия некоторого сигнального пакета в другом
>процесс-потоке.Если речь идет о буквальном "пинге" то имеет смысл использовать AST-процедуру для приема и обработки принятых пакетов, в основном же цикеле посылать оные пакеты. Это соотвественно $QIO[W] - системный сервис
Если смотреть чуть шире:
1) обмен между потоками через очереди (см. lib$insque/lob$remque) или через массивчик с арбитражем доступа посредством mutex-ов или семафоров (поддерживаемых аппаратно архитектурой Alpha+BIOS)2) между процессами:глобальные секции (кусок памяти отображаемый в пространство процессов - требует доп. привилегий), или mailbox-ы - это почти как pipe, почти.
>Все не расжевывайте, доки в инет полно, просто основной концепции достаточно, с
>указанием названий функций.
Не буду.
Спасибо
>Спасибо
Не за что. Все это подробно разжёвано в "OpenVMS Programming Concepts":http://starlet.deltatel.ru/disk$axpdocsep001/opsys/vmsos721/5841/5841pro_contents.html
На более предметные вопросы готов ответить, но лучше мылом.