The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"Запуск внешней программы"
Вариант для распечатки Архивированная нить - только для чтения! 
Пред. тема | След. тема 
Форумы OpenNET: Виртуальная конференция (Public)
Изначальное сообщение [Проследить за развитием треда]

"Запуск внешней программы"
Сообщение от Андрей emailИскать по авторуВ закладки on 19-Авг-02, 09:39  (MSK)
Прошу прощения за такой вопрос, но я давно уже не писал на C
Как мне запустить внешнюю программу из кода на С, но чтобы код ждал завершения исполнения внешней программы и потом уже продожил далее... ( статус завершения выполнения внешней программы, а также желательно ее вывод, отловить в коде)
Спасибо.
  Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

Индекс форумов | Темы | Пред. тема | След. тема
Сообщения по теме

1. "RE: Запуск внешней программы"
Сообщение от lavr emailИскать по авторуВ закладки on 19-Авг-02, 11:08  (MSK)
>Прошу прощения за такой вопрос, но я давно уже не писал на
>C
>Как мне запустить внешнюю программу из кода на С, но чтобы код
>ждал завершения исполнения внешней программы и потом уже продожил далее... (
>статус завершения выполнения внешней программы, а также желательно ее вывод, отловить
>в коде)

man execve или execl

тупой-простой execve (выполнить ping...):

char *host="host.domain";

sprintf(buf,"ping -c 1 %s >/dev/null 2>/dev/null",machine);
ret=system(buf);

if ( ret ...) - анализируем код возврата

>Спасибо.

  Рекомендовать в FAQ | Cообщить модератору | Наверх

3. "RE: Запуск внешней программы"
Сообщение от lavr emailИскать по авторуВ закладки on 19-Авг-02, 11:40  (MSK)
>>Прошу прощения за такой вопрос, но я давно уже не писал на
>>C
>>Как мне запустить внешнюю программу из кода на С, но чтобы код
>>ждал завершения исполнения внешней программы и потом уже продожил далее... (
>>статус завершения выполнения внешней программы, а также желательно ее вывод, отловить
>>в коде)
>
>man execve или execl
>
>тупой-простой execve (выполнить ping...):
>
>char *host="host.domain";
>
>sprintf(buf,"ping -c 1 %s >/dev/null 2>/dev/null",machine);

екарный бабай конечно же:
sprintf(buf,"ping -c 1 %s >/dev/null 2>/dev/null",host);

где host == char *host... (или как аргумент)

>ret=system(buf);
>
>if ( ret ...) - анализируем код возврата
>
>>Спасибо.

  Рекомендовать в FAQ | Cообщить модератору | Наверх

2. "RE: Запуск внешней программы"
Сообщение от Nightman emailИскать по авторуВ закладки on 19-Авг-02, 11:23  (MSK)
>Прошу прощения за такой вопрос, но я давно уже не писал на
>C
>Как мне запустить внешнюю программу из кода на С, но чтобы код
>ждал завершения исполнения внешней программы и потом уже продожил далее... (
>статус завершения выполнения внешней программы, а также желательно ее вывод, отловить
>в коде)
>Спасибо.

м.б. popen
man popen
  Рекомендовать в FAQ | Cообщить модератору | Наверх

4. "RE: Запуск внешней программы"
Сообщение от Владислав emailИскать по авторуВ закладки on 19-Авг-02, 12:08  (MSK)
Воть ... воть етя программа .. :-))

#include <sys/types.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdlib.h> // for exit(int status);

int main(int argc, char *argv[])
{   int fds[2];
    pipe(fds);
  pid_t var_pid = fork();
  if ( var_pid == -1 )
  { fprintf(stderr, "Can't fork !\n");
    exit(1);
  } if ( var_pid == 0 ) // child process
    { close(fds[0]); // close copy of file fd
      dup2(STDOUT_FILENO, fds[1]);
      const char *my_args[] = { "/usr/local/bin/mysql", "-e",
                                "show tables from test", NULL
                        };
      execv(my_args[0], my_args);
      fprintf(stderr, "CAN'T START MySQL !!!\n");
      exit(1);
    }
close(fds[1]);
int child_status = -1;
wait(&child_status);
child_status = WEXITSTATUS(child_status);

   // read output ( child program )
   // fds[0] - is a file descriptor !
   // You can also use read(fd, buffer, sizeof(buffer);
   // where fd == fd[0];

return 0;

}


Мозет здесь и есть незнацительные осыбки, я не проверял прогу ... но идею вы долзны понять :-)

  Рекомендовать в FAQ | Cообщить модератору | Наверх

5. "RE: Запуск внешней программы"
Сообщение от Андрей emailИскать по авторуВ закладки on 19-Авг-02, 12:49  (MSK)
Ну идею я понял.
system() - для исполнения внешних программ, только вот тут нельзя видимо принять данные, выводимые программой, а только статус завершения.
fork() - создать процесс, для исполнения через exec, когда потомок заменяется процессом, который вызывается через exec.
Вообщем, ясно.
Спасибо, вопрос снимается.
  Рекомендовать в FAQ | Cообщить модератору | Наверх


Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру