Модераторы: xvr

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> запуск программы из другой программы, нужен пример 
:(
    Опции темы
Zerstroer
Дата 5.10.2009, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 8.8.2007
Где: Алма-Ата

Репутация: нет
Всего: 3



Возник вопрос в эту тему.
Использую execl().
Задача - последовательный запуск двух процессов. (2 приложения в исполнаяемых файлах).
Код:
Код

#include <stdlib.h>
#include <unistd.h>

using namespace std;

int main(int argc, char** argv) {
    execl("/usr/local/sbin/proc1", (char *) 0);
    execl("/usr/local/sbin/proc2", (char *) 0);
    return (EXIT_SUCCESS);
}

После компилляции (В NetBeans все делаю) запускаю скомпиленое приложение с правами root из под консоли. Получаю сообщение "ошибка сегментирования". С чем связано? Неправильное использование функции?


--------------------
In silico
PM MAIL ICQ   Вверх
vinick
Дата 5.10.2009, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 9.6.2005

Репутация: 4
Всего: 22



Во-первых правильный вызов должен быть таким
Код

 execl("/usr/local/sbin/proc1", "proc1",(char *) 0);

Во-вторых, в случае успешного выполнения exec никогда не возвращает управление, так что второй вызов execl у вас будет сделан только если первый закончился неудачей.
PM MAIL ICQ Jabber   Вверх
svlary
Дата 6.10.2009, 06:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 207
Регистрация: 8.9.2009

Репутация: 4
Всего: 4



Код

execl("/usr/local/sbin/proc1", (char *) 0);

   Смотрим man на ececl :

Цитата

The const char *arg and subsequent ellipses in the execl(), execlp(), and execle()
functions can be thought of as arg0, arg1, ..., argn.  Together  they  describe  a
list  of  one or more pointers to null-terminated strings that represent the argu-
ment list available to the executed program.  The first argument,  by  convention,
should point to the filename associated with the file being executed.
 

   Теперь все понятно ? Т.е. первый элемент ДОЛЖЕН указывать на ИМЯ ФАЙЛА !
PM MAIL   Вверх
Zerstroer
Дата 7.10.2009, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 8.8.2007
Где: Алма-Ата

Репутация: нет
Всего: 3



 smile Отлично!
Спасибо!
Возник резонный вопрос: каким образом из одной программы можно запустить 2 и более приложений?


--------------------
In silico
PM MAIL ICQ   Вверх
vinick
Дата 7.10.2009, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 9.6.2005

Репутация: 4
Всего: 22



Цитата(Zerstroer @  7.10.2009,  11:23 Найти цитируемый пост)
Возник резонный вопрос: каким образом из одной программы можно запустить 2 и более приложений? 

Через связку fork+exec. Порождаете потомка и в нем запускаете exec, потом в родительском процессе опять делаете fork и снова в потомке exec и т.д.
PM MAIL ICQ Jabber   Вверх
Zerstroer
Дата 7.10.2009, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 8.8.2007
Где: Алма-Ата

Репутация: нет
Всего: 3



Благодарю!
man fork - мне в помощь!

Добавлено через 14 минут и 5 секунд
Проверьте пожалуйста синтаксис:
Код

#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>

using namespace std;
int main(int argc, char** argv) {
    execl("/usr/local/sbin/proc1", "proc1", (char *) 0);
    if (fork()) {
      execl("/usr/local/sbin/proc2", "proc1", (char *) 0); 
    }
    return (EXIT_SUCCESS);
}

Таким образом используется?


--------------------
In silico
PM MAIL ICQ   Вверх
Zerstroer
Дата 7.10.2009, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 8.8.2007
Где: Алма-Ата

Репутация: нет
Всего: 3



Уже не надо. Нашел мануал.
МАНУАЛ


--------------------
In silico
PM MAIL ICQ   Вверх
Zerstroer
Дата 7.10.2009, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 8.8.2007
Где: Алма-Ата

Репутация: нет
Всего: 3



И все же...  smile 


--------------------
In silico
PM MAIL ICQ   Вверх
vinick
Дата 7.10.2009, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 9.6.2005

Репутация: 4
Всего: 22



Цитата(Zerstroer @  7.10.2009,  13:08 Найти цитируемый пост)
И все же...  smile  


примерно так:
Код

#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
using namespace std;
int main(int argc, char** argv) {
    int pid;
    if((pid=fork() )== 0)
          execl("/usr/local/sbin/proc1", "proc1", (char *) 0);
    else if( pid < 0)
      { perror("fork");}

    if ((pid=fork() )== 0) {
      execl("/usr/local/sbin/proc2", "proc2", (char *) 0); 
    }
    else if( pid < 0)
      { perror("fork");}

    return (EXIT_SUCCESS);
}


PM MAIL ICQ Jabber   Вверх
Zerstroer
Дата 8.10.2009, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 8.8.2007
Где: Алма-Ата

Репутация: нет
Всего: 3



Почему-то запускает только один процесс. smile 
Использовал код который привел vinick а так же свой вариант:
Код

int main(int argc, char** argv) {
    pid_t ppid = 0;
    ppid = fork();
    if(ppid < 0) {
        } else if( ppid == 0 ) {
             execl("/usr/local/sbin/proc2", "proc2", (char *) 0);
        } else { //parent process
             execl("/usr/local/sbin/proc1", "proc1", (char *) 0);
        }
    return (EXIT_SUCCESS);
}

В моем случае запускается только proc1 (тот, что родительский).
А требуется запуск 2х процессов.

Это сообщение отредактировал(а) Zerstroer - 8.10.2009, 11:10


--------------------
In silico
PM MAIL ICQ   Вверх
Zerstroer
Дата 8.10.2009, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 8.8.2007
Где: Алма-Ата

Репутация: нет
Всего: 3



Оба процесса в обоих случаях запускается. Как сделать так, что бы управление оставалось в программе? следить за pid и за ppid?

Это сообщение отредактировал(а) Zerstroer - 8.10.2009, 13:22


--------------------
In silico
PM MAIL ICQ   Вверх
svlary
Дата 13.10.2009, 06:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 207
Регистрация: 8.9.2009

Репутация: 4
Всего: 4



Цитата

Как сделать так, что бы управление оставалось в программе?

 В КАКОЙ - программе ?! После завершения системного вызова execl "старой" программы уже в памяти нет! Ее сегмент кода замещен кодом из файла, который Вы указали в вызове execl. Поэтому, (на тот случай, если системный вызов не сработал) сразу после вызова нужно ставит строки :

        /* Возврат из вызова execl однозначно указывает на ошибку */
        syslog(LOG_CRIT, "Error at execl(%s) %m", proc_name);
        exit(EXIT_FAILURE);

PM MAIL   Вверх
massiv
Дата 19.10.2009, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 27.9.2009

Репутация: нет
Всего: нет



Цитата(svlary @ 13.10.2009,  06:27)
Цитата

Как сделать так, что бы управление оставалось в программе?

 В КАКОЙ - программе ?! После завершения системного вызова execl "старой" программы уже в памяти нет! Ее сегмент кода замещен кодом из файла, который Вы указали в вызове execl. Поэтому, (на тот случай, если системный вызов не сработал) сразу после вызова нужно ставит строки :

        /* Возврат из вызова execl однозначно указывает на ошибку */
        syslog(LOG_CRIT, "Error at execl(%s) %m", proc_name);
        exit(EXIT_FAILURE);

не совсем понятно, зачем вам следить за тем што происходит с процессми запущенными execl, после запуска оин начинаюит жить своей жизнью. Другое дело , если вы хотитите заставить родительский процесс делать ещё што то помимо создания 2-х дочерних процессов, наспимер дождаться завершения одного из дочерних порцессов. В таком случае што вам мешает это сделать? Пишите нужный ком в родительском и всё, like that:

Код

int main(int argc, char** argv) {
    pid_t ppid = 0;
    ppid = fork();
    if(ppid < 0) {
        } else if( ppid == 0 ) {
             execl("/usr/local/sbin/proc2", "proc2", (char *) 0);
        } else { //parent process
             execl("/usr/local/sbin/proc1", "proc1", (char *) 0);
        }

/*

какой то код, вызывающий допустим waitpid

*/

    return (EXIT_SUCCESS);



PM MAIL   Вверх
MAKCim
Дата 19.10.2009, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



massiv, 
ясно же написано: каждая функция из семейства функций exec* может возвращать ошибку


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Zerstroer
Дата 11.11.2009, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 8.8.2007
Где: Алма-Ата

Репутация: нет
Всего: 3



Спасибо всем, уважаемые, задача была выполена. Реализация найдена.


--------------------
In silico
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.0554 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.