640KB мне хватило на всё.
119 / 50 / 3
Регистрация: 07.06.2009
Сообщений: 442
1

Запуск внешних консольных программ и скриптов

21.08.2011, 19:57. Показов 16467. Ответов 11

Author24 — интернет-сервис помощи студентам
Как в C/C++ запустить внешнюю программу и подключить к ней на стандартные вход и выход дескрипторы потоков (файлов) для записи и чтения соответственно?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.08.2011, 19:57
Ответы с готовыми решениями:

Запуск разных консольных программ через одну кнопку
Добрый вечер. Ребята, подскажите пожалуйста как сделать так, что бы при нажатии кнопки примера, а...

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

Запуск внешних программ из go
Не понимаю, как запустить из golang внешнюю программу Windows, например, notepad++.exe.

Запуск внешних программ
uses dos {$M 2048,0,0} begin swapvectors; exec(GetEnv('COMSPEC'),'/C batnik.bat'); ...

11
404 / 360 / 36
Регистрация: 11.10.2010
Сообщений: 1,907
21.08.2011, 20:18 2
если правильно понял то так
C++
1
system("program<inputfile>outputfile");
0
365 / 247 / 24
Регистрация: 03.04.2011
Сообщений: 558
Записей в блоге: 1
21.08.2011, 21:06 3
Если я правильно понял, тогда
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
 
int main(void)
{
    FILE* f;
    char buf[128];
    f = popen("ls -1","r");
    while (fgets(buf,127,f))
    {
        printf("%s\n",buf);
    }
    fclose(f);
}
Вот как то так, короче тебе в стороне popen смотреть
1
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
21.08.2011, 21:11 4
Если нужно и чтение и запись, то man pipe fork dup2 и любой exec
0
640KB мне хватило на всё.
119 / 50 / 3
Регистрация: 07.06.2009
Сообщений: 442
21.08.2011, 21:13  [ТС] 5
Не-а, надо из запускающей программы писать в вызванную и читать из неё.
Типа так
текстовый_файл Файл1, Файл2;
Файл1=открыть_для_записи(внешняя_команда);
Файл2=открыть_для_чтения(из_той_же_команды);
....
fprintf(Файл1, "Записываем данные на стандартный вход внешней команды");
fscanf(Файл2, Буфер_для_данных_получаемых_из_внешней_команды);
...
close(Файл1);
close(Файл2);
0
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
21.08.2011, 21:15 6
Вам pomkalk написал направление
0
640KB мне хватило на всё.
119 / 50 / 3
Регистрация: 07.06.2009
Сообщений: 442
21.08.2011, 21:19  [ТС] 7
Цитата Сообщение от pomkalk Посмотреть сообщение
popen смотреть
Да, спасибо, но не вижу описания popen и примеров, что б можно было два потока привязать.

А почему
Цитата Сообщение от pomkalk Посмотреть сообщение
char buf[128];
...
fgets(...,127,...)
разве fgets что-то ещё дописывает?
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
21.08.2011, 21:56 8
Цитата Сообщение от skvor Посмотреть сообщение
Да, спасибо, но не вижу описания popen и примеров, что б можно было два потока привязать.
И правильно что не видите, popen() такого не умеет, я вам выше написал где почитать.

Цитата Сообщение от skvor Посмотреть сообщение
разве fgets что-то ещё дописывает?
Нет, оно и так size-1 пишет, можете смело fgets(,sizeof(buf),) делать.
0
204 / 205 / 16
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
21.08.2011, 22:16 9
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
 
 
int main(int argc, char *argv[]) {
    int pipefd[2];
    pid_t ls_pid, wc_pid;
 
    pipe(pipefd);
 
    // тут мы переназначим stdout на наш пайп
    if ((ls_pid = fork()) == 0) {
        dup2(pipefd[1],STDOUT_FILENO);
        close(pipefd[0]);
        execl("/bin/ls", "ls","-al", NULL);
        perror("exec ls failed");
        exit(-1);
    }
    
    // тут stdin
    if ((wc_pid = fork()) == 0) {
        dup2(pipefd[0], STDIN_FILENO);
        close(pipefd[1]);
        execl("/usr/bin/wc", "wc", NULL);
        perror("exec wc failed");
        exit(-2);
    }
    return 0;
}
$ 14 106 774
1
724 / 224 / 72
Регистрация: 01.03.2011
Сообщений: 629
23.08.2011, 17:56 10
Не совсем в тему.
Цитата Сообщение от villu Посмотреть сообщение
C
1
2
3
execl("/bin/ls", "ls","-al", NULL);
perror("exec ls failed");
exit(-1);
Где-то слышал утверждение, что exit() из ребенка не хорошо, но вот почему так и не понял.
Может кто-нибудь просветит?
0
204 / 205 / 16
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
23.08.2011, 20:49 11
Цитата Сообщение от prik Посмотреть сообщение
Не совсем в тему.

Где-то слышал утверждение, что exit() из ребенка не хорошо, но вот почему так и не понял.
Может кто-нибудь просветит?
потому что по-хорошему после в родителе нужно делать waitpid, иначе остается зомби-процесс, для того, чтоб родитель смог получить тот самый код exit. Но для данного примера ничего страшного.
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
23.08.2011, 21:11 12
Цитата Сообщение от prik Посмотреть сообщение
Где-то слышал утверждение, что exit() из ребенка не хорошо, но вот почему так и не понял.
Как-то мутно вы свой вопрос формулируете)
если свести его к exit(3) vs _exit(2), то да, правильнее делать _exit(2). Он не сбросит буфера stdio (попробуйте вставить printf("foo")), не позовет обработчики atexit() и не удалит временные файлы (tmpfile()). Но как справедливо сказал автор примера - тут это не важно.
Еще все-таки принято _exit(127) после неудачного exec ставить)
1
23.08.2011, 21:11
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.08.2011, 21:11
Помогаю со студенческими работами здесь

Запуск внешних программ
Передо мной стоит задача: считывать данные из текстового файла построчно. В строках содержаться...

Запуск внешних программ из WinForms
создаю приложение, выдает такую ошибку : &quot;Имя &quot;Process&quot; отсутствует в текущем контексте&quot; вот код ...

Запуск внешних программ с параметром
Собственно по сабжу видно чего я хочу, C# я только начинаю изучать, хочу научится запускать на...

Запуск внешних программ с PHP
Можно ли сделать так что бы на странице была допустим кнопка по нажатии на которую запускалась...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru