URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 1583
[ Назад ]

Исходное сообщение
"Запуск приложения из C"

Отправлено als , 11-Апр-03 17:00 
Доброе время!
Переделываю программу на С (юзаю FreeBSD 4.5)
Из программы надо запустить другое приложение.
Незнаю как это сделать :(
Самое печальное, даже не представляю где об этом можно почитать :((
Люди добрые, помогите глупому ...
пожалуйста.

Содержание

Сообщения в этом обсуждении
"Запуск приложения из C"
Отправлено XMan , 11-Апр-03 19:18 
man exec
?

"Запуск приложения из C"
Отправлено als , 12-Апр-03 13:47 
>man exec
>?
видел, смутило то, что это builtin shell commands.
Разве компилятор их съест?

"Запуск приложения из C"
Отправлено x33 , 12-Апр-03 15:59 
man 3 exec =)
функции execl, execlp, execle, exect, execv, execvp - execute a file


"Запуск приложения из C"
Отправлено als , 22-Апр-03 09:54 
>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.
Получается, что новый процесс замещает старый, а мне бы что бы старый продолжал работать.
Как это можно сделать?


"Запуск приложения из C"
Отправлено rnl , 22-Апр-03 11:49 
если совсем просто, но небезопасно, то man system.
Если хоть какая-то безопасность все-таки нужна, то все те же exec функции, только перед их вызовом делать fork и уже в рожденном детишке exec.

>Получается, что новый процесс замещает старый, а мне бы что бы старый
>продолжал работать.
>Как это можно сделать?



"Запуск приложения из C"
Отправлено bug , 26-Апр-03 21:20 
>если совсем просто, но небезопасно, то man system.
>Если хоть какая-то безопасность все-таки нужна, то все те же exec функции,
>только перед их вызовом делать fork и уже в рожденном детишке
>exec.
>
>>Получается, что новый процесс замещает старый, а мне бы что бы старый
>>продолжал работать.
>>Как это можно сделать?

есть такая функция system() если ее использовать то после выполнения нового процесса старый продолжит выполнятся.


"Запуск приложения из C"
Отправлено Breeze , 22-Апр-03 13:15 
В UNIX'ах для запуска процессов используется связка fork-exec.
сначала fork - создает копию родительского процесса и эта копия делает exec и замещает свой код.
Про это во всех книжках написано. :) Лучше почитай. Там есть ньюансы. Читать лучше Робачевского ("книга с черепашкой" - у нас на кафедре уже легендарна :))

"Запуск приложения из C"
Отправлено als , 24-Апр-03 08:03 
Спасибо всем.
Все получилось, мне вполне хватило system.
Еще раз спасибо.

"Запуск приложения из C"
Отправлено alexhack , 28-Апр-03 08:08 
>Доброе время!
>Переделываю программу на С (юзаю FreeBSD 4.5)
>Из программы надо запустить другое приложение.
>Незнаю как это сделать :(
>Самое печальное, даже не представляю где об этом можно почитать :((
>Люди добрые, помогите глупому ...
>пожалуйста.

Народ, а подскажите плиз как реализовать вариант использования fork() под OpenVMS for Alpha, очень надо. Примеры если можно, хочется сразу отметить, что под эту ОС я нашел только функцию v_fork(), но работают они по разному из-за специфики самой ОС. А можно ли все таки, в исходниках Apache ничего не нашел, может кто подскажет.


"Запуск приложения из C"
Отправлено Ruslan R. Laishev , 05-Май-03 13:26 
Привет!

>Народ, а подскажите плиз как реализовать вариант использования fork() под OpenVMS for
>Alpha, очень надо. Примеры если можно, хочется сразу отметить, что под
>эту ОС я нашел только функцию v_fork(), но работают они по
>разному из-за специфики самой ОС. А можно ли все таки, в
>исходниках Apache ничего не нашел, может кто подскажет.
Аналога forka() нету в VMS-е если не считать vfork(), есть несколько вариантов порождения процесса или подпроцесса, скажите общие потребности - я присоветую.



"Запуск приложения из C"
Отправлено alexhack , 05-Май-03 17:00 
>Привет!
>
>>Народ, а подскажите плиз как реализовать вариант использования 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 туда другой.

Интересно, конечно было бы ваше мнение все таки по статьям.



"Запуск приложения из C"
Отправлено SysMan , 06-Май-03 13:27 
>Есть программа обычная, использующая 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 и выдача команд в поток, и получения в зад потока вывода.

Что вам-то требуется?


"Запуск приложения из C"
Отправлено alexhack , 06-Май-03 14:31 
Спасибо, что просветили по поводу потоков. Я не мог понять для OpenVMS они  или для DEC-овского UNIX-a. Кстати, потоки поддерживаются в OpenVMS? хотя бы в 7.3?

Проблема конечно не моя, но меня очень интересует, как она понимается или решается в рамках VMS (кажется, решили ее как раз именно так, через dcl скрипт). Программа была простая, делался fork, один слушал интернет, а другой пинговал интернет. На другой vms запускался такой же процесс и все. Получался обмен данными. 2x2.требовалось лишь только иметь один общий настроечный файл, но ведь никто не мешает процессу потомку прочитать его снова. Насколько я знаю, в обычном fork общими остаются открытые дексрипторы файлов и потоки ввода/вывода/ошибок, а также все присоединенные общие сегменты памяти (shmop).

>>Интересно, конечно было бы ваше мнение все таки по статьям.
> Честно говоря, мне хотелось бы понять первичную цель. Механического порта кода

Да, я все таил надежду, что можно извратиться как нить и опля, все хорошо.

Насколько я понял это невозможно из-за архитектурных особенностей?

>с fork-ом не получиться, это очевидно. Под OpenVMS 7.0 и выше
>можно пользовать для простоты PIPE(s) - это метод грубый и обычно
>не пользуется VMS-никами, однако для униходиов може быть единственно понятным. Это
>порождение подпроцесса с DCL и выдача команд в поток, и получения
>в зад потока вывода.
>
> Что вам-то требуется?

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

Все не расжевывайте, доки в инет полно, просто основной концепции достаточно, с указанием названий функций.

С уважением Александр.


"Запуск приложения из C"
Отправлено SysMan , 06-Май-03 18:52 
>Спасибо, что просветили по поводу потоков. Я не мог понять для 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, почти.

>Все не расжевывайте, доки в инет полно, просто основной концепции достаточно, с
>указанием названий функций.
Не буду.


"Запуск приложения из C"
Отправлено alexhack , 07-Май-03 12:58 
Спасибо

"Запуск приложения из C"
Отправлено SysMan , 07-Май-03 13:12 
>Спасибо
Не за что. Все это подробно разжёвано в "OpenVMS Programming Concepts":

http://starlet.deltatel.ru/disk$axpdocsep001/opsys/vmsos721/5841/5841pro_contents.html

На более предметные вопросы готов ответить, но лучше мылом.