Как запускать приложения из своей программы ?

Модератор: Модераторы разделов

zayac_val
Сообщения: 38
ОС: openSuse10.3

Как запускать приложения из своей программы ?

Сообщение zayac_val »

В MFC есть функция ShellExecute(...), с помощью которой можно запускать из программы любое приложение, я написал програмульку в KDevelop и все чего не хватает это аналога ShellExecute(...) в KDevelop т.е. в Qt. Помогите пожалуйста, бо умираю .
Спасибо сказали:
allez
Сообщения: 2223
Статус: Не очень злой админ :-)
ОС: SuSE, CentOS, FreeBSD, Windows

Re: Как запускать приложения из своей программы ?

Сообщение allez »

Возможно, скажу глупость, поэтому прошу не судить строго, но не подойдет ли вам в данном случае функция system()?
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu

Re: Как запускать приложения из своей программы ?

Сообщение serzh-z »

zayac_val
Если приложение линкуется с библиотеками KDE, то можно использовать KRun, который является частью библиотеки kio.
Спасибо сказали:
zayac_val
Сообщения: 38
ОС: openSuse10.3

Re: Как запускать приложения из своей программы ?

Сообщение zayac_val »

serzh-z писал(а):
08.05.2008 16:24
zayac_val
Если приложение линкуется с библиотеками KDE, то можно использовать KRun, который является частью библиотеки kio.

В KDevelop я новичок, при созданеи проекта выбирал "Простое приложение KDE" , я так понимаю это значит, что моя прога линкуется с библиотеками KDE ?
А в Qt нет какого-то метода ?
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu

Re: Как запускать приложения из своей программы ?

Сообщение serzh-z »

zayac_val писал(а):
08.05.2008 17:09
моя прога линкуется с библиотеками KDE ?
Да.
zayac_val писал(а):
08.05.2008 17:09
А в Qt нет какого-то метода ?
Нет. Есть QProcess, но он не позволяет определить связанное приложение по MIME-типу.
Спасибо сказали:
MiK13
Сообщения: 1292
ОС: Linux Debian

Re: Как запускать приложения из своей программы ?

Сообщение MiK13 »

allez писал(а):
08.05.2008 16:05
Возможно, скажу глупость, поэтому прошу не судить строго, но не подойдет ли вам в данном случае функция system()?

У меня тоже возник аналогичный вопрос.
Но, с другой стороны, недостаток system(...) -- она, по-моему, будет ждать завершения выполнения команды.
Поэтому, наверно, лучше использовать что-то типа if(!fork()) exec.... Правда, при этом, чтобы не было зомби, надо ловить сигнал SIGCHLD и выдавать wait.
Или, может быть эта технология в иксах не применима?
Спасибо сказали:
ssh
Сообщения: 78
ОС: Debian

Re: Как запускать приложения из своей программы ?

Сообщение ssh »

Раз программа на Qt, то всего логичнее использовать QProcess. Бог с ними, с mime-типами, зато можно автоматически реализовать двусторонний обмен данными с потомком, используя его стандартные потоки.

system, действительно, ждет завершения потомка; если это нежелательно, то можно посмотреть в сторону spawn - там был какой-то вариант с флагом NOWAIT, что ли. В том и другом случаях взаимодействие программ организовать сложно, разве что через файловую систему, ну, или придется конвейеры какие-то организовывать,

А с fork'ом имеет смысл связываться только в самом крайнем случае - если, например, надо породить демона, который будет работать совершенно автономно от родителя и каких-либо консолей.
Спасибо сказали:
un-defined
Сообщения: 145
ОС: Kubuntu, Gentoo

Re: Как запускать приложения из своей программы ?

Сообщение un-defined »

ssh писал(а):
08.05.2008 22:20
А с fork'ом имеет смысл связываться только в самом крайнем случае - если, например, надо породить демона, который будет работать совершенно автономно от родителя и каких-либо консолей.


Чем же так fork/exec не угодил-то... уж куда ж стандартнее-то..
Don`t try - just do or do not ©Master Joda
Спасибо сказали:
MiK13
Сообщения: 1292
ОС: Linux Debian

Re: Как запускать приложения из своей программы ?

Сообщение MiK13 »

ssh писал(а):
08.05.2008 22:20
В том и другом случаях взаимодействие программ организовать сложно, разве что через файловую систему, ну, или придется конвейеры какие-то организовывать

Я с общими файлами работал в DOS и Windows и не скажу, что тут есть какие-то особые сложности.
В Linux предпочитаю использовать разделяемую памяти, а также очереди сообщений. Можно и сигналы посылать.
Спасибо сказали:
ssh
Сообщения: 78
ОС: Debian

Re: Как запускать приложения из своей программы ?

Сообщение ssh »

un-defined писал(а):
09.05.2008 00:31
Чем же так fork/exec не угодил-то... уж куда ж стандартнее-то..


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

Что касается файлов, разделяемой памяти и т.п. - все это замечательно, но придется беспокоиться о синхронизации доступа, создавать семафоры... А вот QProcess, как, собственно, и вся Qt, предлагает очень изящное и надежно работающее решение.
Спасибо сказали:
Аватара пользователя
RasenHerz
Сообщения: 1341
ОС: Arch Linux amd64

Re: Как запускать приложения из своей программы ?

Сообщение RasenHerz »

ssh писал(а):
09.05.2008 11:26
un-defined писал(а):
09.05.2008 00:31
Чем же так fork/exec не угодил-то... уж куда ж стандартнее-то..


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

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

во-первых, что-то я не понял - речь ведь идет о запуске произвольной программы, тогда о каком упралении можно говорить как не об управлении через сигналы(если иное не предусмотрено, к примеру, запускаемая программа слушает порт и ожидает комманд из вне)? во-вторых, чтобы создать процесс и незаместить свой собственный, программа должна сделать вызв fork(), при этом не будет создаваться вся копия родительского процесса(copy-on-write) и при необходимости сделать exec(), который замещает вызвавший процесс(в данном случае порожденный) и загружает в него другой исполняемый файл; после этого возможно лишь управление процессом через сигналы или другим ПРЕДУСМОТРЕННЫМ в родительском и дочернем процессе способом. не думаю что Trolltech нашли иное решение, так что если я в QProcess загружу программу управлять которой можно только через сигналы, то управлять ей можно будет(без хирургического вмешательства) только через сигналы.. просто вся реализация скрыта под километровым слоем классов.
Спасибо сказали:
un-defined
Сообщения: 145
ОС: Kubuntu, Gentoo

Re: Как запускать приложения из своей программы ?

Сообщение un-defined »

ssh писал(а):
09.05.2008 11:26
Неудобством в управлении потомком - тут уже упоминалась необходимость посылки каких-то сигналов. Кроме того, вроде бы речь шла о запуске произвольной программы, а не копии выполняемого процесса.

Не каких-то, а SIGCHLD, и не посылка, а как раз наоборот, прием :)
Насчет запуска произвольной программы, а не копии - посмотрите повнимательней на функции семейства exec.
К слову, system работает тоже через fork/exec, но запускает не програму, а shell, а уже в shell - программу. Да и в шелле программа запускается все тем же способом. Т.е. два процесса создается фактически, и время расходуется соответственно больше.

ssh писал(а):
09.05.2008 11:26
Что касается файлов, разделяемой памяти и т.п. - все это замечательно, но придется беспокоиться о синхронизации доступа, создавать семафоры... А вот QProcess, как, собственно, и вся Qt, предлагает очень изящное и надежно работающее решение.

Специально залез в исходники QProcess за подтверждением - угадайте, каким образом они запускают новый процесс?:)


Согласен в одном - если приложение Qt, то надо пользоваться возможностями Qt. Но изначально вопрос был про KDevelop. Кстати почему-то автор поставил знак равенства между KDevelop и Qt, что, разумеется, далеко не так.


RasenHerz писал(а):
09.05.2008 13:41
во-первых, что-то я не понял - речь ведь идет о запуске произвольной программы, тогда о каком упралении можно говорить как не об управлении через сигналы(если иное не предусмотрено, к примеру, запускаемая программа слушает порт и ожидает комманд из вне)? во-вторых, чтобы создать процесс и незаместить свой собственный, программа должна сделать вызв fork(), при этом не будет создаваться вся копия родительского процесса(copy-on-write) и при необходимости сделать exec(), который замещает вызвавший процесс(в данном случае порожденный) и загружает в него другой исполняемый файл; после этого возможно лишь управление процессом через сигналы или другим ПРЕДУСМОТРЕННЫМ в родительском и дочернем процессе способом. не думаю что Trolltech нашли иное решение, так что если я в QProcess загружу программу управлять которой можно только через сигналы, то управлять ей можно будет(без хирургического вмешательства) только через сигналы.. просто вся реализация скрыта под километровым слоем классов.


Ну внутри QProcess делается канал, чтобы родитель мог общаться с потомком через стандартные потоки ввода/вывода. Ну и SIGCHLD конечно. А спрятано это все очень глубоко, да..
Don`t try - just do or do not ©Master Joda
Спасибо сказали:
MiK13
Сообщения: 1292
ОС: Linux Debian

Re: Как запускать приложения из своей программы ?

Сообщение MiK13 »

un-defined писал(а):
09.05.2008 13:52
Ну внутри QProcess делается канал, чтобы родитель мог общаться с потомком через стандартные потоки ввода/вывода. Ну и SIGCHLD конечно. А спрятано это все очень глубоко, да..

Подозреваю, что QProcess -- это просто реализация более высокого уровня процедур из стандартной библиотеки ввода/вывода popen и pclose:
Описание
#include <stdio.h>
FILE * popen(const char *comstring, const char *type);
int pclose(FILE *strm);


Как и процедура system, процедура popen создает дочерний процесс командного интерпретатора для запуска команды, заданной параметром comstring. Но, в отличие от процедуры system, она также создает канал между вызывающим процессом и командой, а затем возвращает структуру FILE, связанную с этим каналом. Если значение параметра type равно w, то программа может выполнять запись в стандартный ввод при помощи структуры FILE. Если же значение параметра type равно r, то программа сможет выполнять чтение из стандартного вывода программы. Таким образом, процедура popen представляет простой и понятный метод взаимодействия с другой программой.
Для закрытия потока, открытого при помощи процедуры popen, должна всегда использоваться процедура pclose. Она будет ожидать завершения команды, после чего вернет статус ее завершения.
Спасибо сказали:
un-defined
Сообщения: 145
ОС: Kubuntu, Gentoo

Re: Как запускать приложения из своей программы ?

Сообщение un-defined »

MiK13 писал(а):
10.05.2008 02:09
un-defined писал(а):
09.05.2008 13:52
Ну внутри QProcess делается канал, чтобы родитель мог общаться с потомком через стандартные потоки ввода/вывода. Ну и SIGCHLD конечно. А спрятано это все очень глубоко, да..

Подозреваю, что QProcess -- это просто реализация более высокого уровня процедур из стандартной библиотеки ввода/вывода popen и pclose


Именно, только не popen/pclose, а проще - обычный pipe(2)
Don`t try - just do or do not ©Master Joda
Спасибо сказали:
vladimir_l
Сообщения: 24

Re: Как запускать приложения из своей программы ?

Сообщение vladimir_l »

А можнет быть кто-то знает как через QProcess запустить "rz < /dev/ttyS0 > /dev/ttyS0"
Через system("sz /111 > /dev/ttyS0 < /dev/ttyS0") и system("rz < /dev/ttyS0 > /dev/ttyS0") всё работает, но нельзя отследить результаты(какой файл был принят и куда, и принят(передан) ли вообще).
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: Как запускать приложения из своей программы ?

Сообщение watashiwa_daredeska »

vladimir_l писал(а):
10.10.2008 12:42
А можнет быть кто-то знает как через QProcess запустить "rz < /dev/ttyS0 > /dev/ttyS0"

Собственно, с QProcess не работал, но рискну предположить, что можно делать по аналогии с system(): запускать $SHELL -c 'command'.
Спасибо сказали:
vladimir_l
Сообщения: 24

Re: Как запускать приложения из своей программы ?

Сообщение vladimir_l »

watashiwa_daredeska писал(а):
10.10.2008 13:03
запускать $SHELL -c 'command'.

Это как?
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: Как запускать приложения из своей программы ?

Сообщение watashiwa_daredeska »

vladimir_l писал(а):
10.10.2008 16:18
Это как?

Например, /bin/sh -c 'rz < /dev/ttyS0 > /dev/ttyS0'

Как запускать такую команду средствами QProcess пусть ответят те, кто этот QProcess хотя бы в глаза видели :)
Спасибо сказали:
vladimir_l
Сообщения: 24

Re: Как запускать приложения из своей программы ?

Сообщение vladimir_l »

watashiwa_daredeska писал(а):
10.10.2008 16:31
vladimir_l писал(а):
10.10.2008 16:18
Это как?

Например, /bin/sh -c 'rz < /dev/ttyS0 > /dev/ttyS0'

Как запускать такую команду средствами QProcess пусть ответят те, кто этот QProcess хотя бы в глаза видели :)

Поместил эту команду в QProcess, все работает. Только вывод, почему-то, идет в обработчик ошибок readyReadStderr()

Код: Выделить всё

Proc=new QProcess(QString("sh"));//this);
Proc->addArgument("-c");
Proc->addArgument("''rz -b -E < /dev/ttyS0 > /dev/ttyS0''");
connect(Proc,SIGNAL(readyReadStderr()),this,SLOT(readErrProc()));
connect(Proc,SIGNAL(readyReadStdout()),this,SLOT(readOutProc()));
if(Proc->start()) cout<<"Процесс запущен"<<endl;
Спасибо сказали: