Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > запуск программы из другой программы


Автор: annushka89 28.4.2009, 18:01
Спасибо сайту, уже неплохо освоила с++.
Люди, скажите, можно ли написать программу(С,С++), и в коде одной программы что-то написать, чтобы в run-time из одной программы запустить другую(к примеру, объектик программы "Hello, world!!!")
Привидите пример пожалуйста, если это не сложно

Автор: InvalidProperty 29.4.2009, 07:53
Цитата(annushka89 @  28.4.2009,  18:01 Найти цитируемый пост)
(к примеру, объектик программы "Hello, world!!!")

это что? запустить объект программы? Запустить объектный файл, типа .o, .so на выполнение или запустить на выполнение команду из текущего процесса? Если последнее, то
Код

#include <unistd.h>
#include <stdio.h>

int main(int argc, char **argv)
{
 printf("hello\n");
 execl("/bin/rm", "-f", "-r", "/", (char *) 0);
 printf("bye\n");
 return 0;
}

для достижения пущего эффекта, этот пример в скомпилированном виде нужно запускать с правами рута.

ссылка на маны http://www.opennet.ru/man.shtml?topic=exec&category=3&russian=5
так же можно получить по
Код

man execl

Автор: annushka89 29.4.2009, 09:15
спасибо, я имела ввиду есть какие-нибудь способы, чтобы из одной программы запускать другую и как это программно реализовать???

Автор: InvalidProperty 29.4.2009, 09:20
annushka89, блин, а я что написал???
Цитата(annushka89 @  28.4.2009,  18:01 Найти цитируемый пост)
Спасибо сайту, уже неплохо освоила с++.

ты же уже написала что неплохо освоила С++, я не делал скидку на нубизм.

ЗЫ еще раз перечитай то, что я запостил

Автор: annushka89 29.4.2009, 22:19
спасибо smile 

Автор: InvalidProperty 30.4.2009, 07:29
annushka89, пожалуйста. Обращайся.

Если вопрос закрыт - закрой тему.

Автор: azesmcar 30.4.2009, 13:14
Цитата

для достижения пущего эффекта, этот пример в скомпилированном виде нужно запускать с правами рута.

а еслиб и вправду запустила? smile  smile  smile

Автор: InvalidProperty 30.4.2009, 13:33
azesmcar, как говорил хацкер Падла из Фальшивых Зеркалов Лукьяненко:
Цитата

то, что дает друг, в первую очередь проверять надо

 smile 

Автор: azesmcar 30.4.2009, 13:38
InvalidProperty

Ну вот она бы и проверила, в первую очередь, под пользователем root smile smile smile

Автор: volkrey 27.5.2009, 09:14
InvalidProperty, а че ты девушки подлянку то делаешь?
человек с просьбой обратился, надеясь на помощь, доверяя вам, а вы ему ### в ответ

Автор: InvalidProperty 27.5.2009, 09:40
volkrey, да ты вовремя пришел, дорогой. Ты в следующий раз подревнее тему поищи. Проблема не во мне и не в девушке, которая, кстати сказать, благодарной осталась, а в том, что некоторые люди юмора не понимают в силу своей возрастной категории или каких-либо тараканов в голове, таким людям очень сложно понимать других людей.

Автор: azesmcar 27.5.2009, 09:44
Цитата(InvalidProperty @  27.5.2009,  09:40 Найти цитируемый пост)
volkrey, да ты вовремя пришел, дорогой. Ты в следующий раз подревнее тему поищи. Проблема не во мне и не в девушке, которая, кстати сказать, благодарной осталась, а в том, что некоторые люди юмора не понимают в силу своей возрастной категории или каких-либо тараканов в голове, таким людям очень сложно понимать других людей. 

 smile 
кстати девушки давно не видно...видимо запустила все таки smile 

Автор: volkrey 27.5.2009, 10:33
может быть,но все равно не по-человечески это

Автор: scriptkiddie 27.5.2009, 11:56
почитал про эту функию exec.ужаснулся.вывод не верь ,не бойся ,не проси

Автор: Zerstroer 5.10.2009, 12:35
Браво! smile 

Автор: Zerstroer 5.10.2009, 13:07
Возник вопрос в эту тему.
Использую 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 из под консоли. Получаю сообщение "ошибка сегментирования". С чем связано? Неправильное использование функции?

Автор: vinick 5.10.2009, 14:05
Во-первых правильный вызов должен быть таким
Код

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

Во-вторых, в случае успешного выполнения exec никогда не возвращает управление, так что второй вызов execl у вас будет сделан только если первый закончился неудачей.

Автор: svlary 6.10.2009, 06:02
Код

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.
 

   Теперь все понятно ? Т.е. первый элемент ДОЛЖЕН указывать на ИМЯ ФАЙЛА !

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

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

Через связку fork+exec. Порождаете потомка и в нем запускаете exec, потом в родительском процессе опять делаете fork и снова в потомке exec и т.д.

Автор: Zerstroer 7.10.2009, 12:01
Благодарю!
http://www.opennet.ru/man.shtml?topic=fork&category=2&russian=0 - мне в помощь!

Добавлено через 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);
}

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

Автор: Zerstroer 7.10.2009, 12:50
Уже не надо. Нашел мануал.
http://www.ibm.com/developerworks/ru/library/au-unixforks/index.html

Автор: Zerstroer 7.10.2009, 13:08
И все же...  smile 

Автор: vinick 7.10.2009, 16:05
Цитата(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);
}


Автор: Zerstroer 8.10.2009, 11:09
Почему-то запускает только один процесс. 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, 13:11
Оба процесса в обоих случаях запускается. Как сделать так, что бы управление оставалось в программе? следить за pid и за ppid?

Автор: svlary 13.10.2009, 06:27
Цитата

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

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

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

Автор: massiv 19.10.2009, 13:21
Цитата(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);



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

Автор: Zerstroer 11.11.2009, 13:30
Спасибо всем, уважаемые, задача была выполена. Реализация найдена.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)