Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
танкист34
-62 / 0 / 0
Регистрация: 15.03.2013
Сообщений: 328
#1

Запуск процесса - C++

05.01.2014, 18:16. Просмотров 1430. Ответов 14
Метки нет (Все метки)

Здравствуйте! Как получить данные из потока stderr и стандартного потока вывода процесса?
Вот код:
C++
1
2
3
4
5
6
       char t1[] = "ls";
           char t2[] = "-l";
           char *h = t1;
           char *g = t2;
       char *argv[] = {h, g, (char *) 0 }; 
           execv("/bin/ls", argv);
и можно ли как-то по короче написать мой код запуска процесса, просто на одном из сайтов видел такую запись
C++
1
2
3
4
5
6
  #include <unistd.h>
 
              int ret;
              char *cmd[] = { "ls", "-l", (char *)0 };
              ...
              ret = execv ("/bin/ls", cmd);
но при такой записи у меня выходят ошибка(предупреждения):
zadanie.cpp:24:52: предупреждение: deprecated conversion from string constant to «char*» [-Wwrite-strings]
zadanie.cpp:24:52: предупреждение: deprecated conversion from string constant to «char*» [-Wwrite-strings]
Всем спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.01.2014, 18:16
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Запуск процесса (C++):

Запуск процесса из С++ - C++
Visual Studio 2013 Пишу код для открытия блокнота: #include &lt;stdio.h&gt; #include &lt;windows.h&gt; #include &lt;iostream&gt; using...

Запуск дочернего процесса - C++
Почему второй вариант не запускает дочерний процесс? // Работает CreateProcess(L&quot;programma.exe&quot;, L&quot;programma.exe file.txt&quot;, ...

Запуск параллельного процесса - C++
Добрый вечер Подскажите пожалуйста Как на СИ++ реализовать параллельный процесс допустим чтобы там проверить нажатие каких либо клавиш....

Отловить запуск процесса - C++
Здравствуйте. Хотелось бы узнать как на c++ можно проверить включение программы(не нужно проверять включена ли она уже) программа должна...

Запуск и остановка дочернего процесса - C++
Здравствуйте, Есть у меня программа, где нечто выполняется в бесконечном цикле. Есть программа, которая первую запускает. Причем...

Библиотеки процесса, защита от изменения процесса - C++
Здраствуйте. 1) Как можно получить список библиотек (dll, asi), которые уже загружены в процесс какой-то программы? Мне нужно чекать...

14
Байт
Эксперт C
16344 / 10620 / 1590
Регистрация: 24.12.2010
Сообщений: 20,258
05.01.2014, 19:18 #2
Цитата Сообщение от танкист34 Посмотреть сообщение
Как получить данные из потока stderr и стандартного потока вывода процесса?
Перенаправь выводы в файлы и читай
C
1
system("ls -l >a.txt 2>err.txt");
0
танкист34
-62 / 0 / 0
Регистрация: 15.03.2013
Сообщений: 328
05.01.2014, 19:45  [ТС] #3
Байт , спасибо, но это не то=)) мне процесс надо запускать именно так как я указал в теме, а system просто передаёт управление командному интерпретатору. Допустим, потребуется 10 процессов запустить и они будут выполняться последовательно, что мне не нужно. Мне необходимо параллельно 10 запустить, а уже потом с каждого получать информацию, но проблема не с запуском, а как работать с потоками(вывода) процессов.
Я для примера привёл запуск, чтобы узнать как упростить мой код.
0
Байт
Эксперт C
16344 / 10620 / 1590
Регистрация: 24.12.2010
Сообщений: 20,258
05.01.2014, 20:01 #4
танкист34, вопрос понял. Вот в Qt есть такой класс QProcess. И он умеет как запускать процессы (асинхронно), так и перехватывать их вывод, и все очень просто. В Си под Линухом, видимо, тоже такие механизмы есть, работа с каналами ввода-вывода - одна из фишек иксов, но тогда тебе надо в другой раздел.
0
танкист34
-62 / 0 / 0
Регистрация: 15.03.2013
Сообщений: 328
06.01.2014, 03:31  [ТС] #5
Цитата Сообщение от Байт Посмотреть сообщение
танкист34, вопрос понял. Вот в Qt есть такой класс QProcess. И он умеет как запускать процессы (асинхронно), так и перехватывать их вывод, и все очень просто. В Си под Линухом, видимо, тоже такие механизмы есть, работа с каналами ввода-вывода - одна из фишек иксов, но тогда тебе надо в другой раздел.
в какой раздел? тему же вроде нельзя дублировать?
0
Байт
Эксперт C
16344 / 10620 / 1590
Регистрация: 24.12.2010
Сообщений: 20,258
06.01.2014, 12:12 #6
Цитата Сообщение от танкист34 Посмотреть сообщение
в какой раздел?
http://www.cyberforum.ru/cpp-linux/
http://www.cyberforum.ru/c-linux/
Цитата Сообщение от танкист34 Посмотреть сообщение
тему же вроде нельзя дублировать?
Ну, назови ее как-то иначе. И оформи по-другому. С учетом того, что в стартовой формулировке не все однозначно. Подчеркни, что требуется асинхронность и именно работа с каналами в/в. И вообще поищи информацию об этих каналах. Чем больше ты будешь знать, тем точнее сформулируешь вопрос, тем больше шансов получить внятный ответ.
Можно еще ссылку дать на этот топик.
И это будет не дублирование темы, а ее развитие.
0
0x10
2475 / 1648 / 247
Регистрация: 24.11.2012
Сообщений: 4,069
06.01.2014, 12:16 #7
Первая же мысль: man 2 pipe
1
танкист34
-62 / 0 / 0
Регистрация: 15.03.2013
Сообщений: 328
06.01.2014, 12:46  [ТС] #8
Цитата Сообщение от 0x10 Посмотреть сообщение
Первая же мысль: man 2 pipe
ну pipe это само собой разумеется, проблема в том, что я не знаю что туда записывать, т.е. как с запущенного процесса получить данные...
спасибо за ответ
0
0x10
2475 / 1648 / 247
Регистрация: 24.11.2012
Сообщений: 4,069
06.01.2014, 13:09 #9
танкист34, тут можно вспомнить, что файловые дескрипторы наследуются дочерними процессами, и перед вызовом exec перенаправить stdout в pipe. С stderr можно поступить аналогично.
Сильно упрощенный пример:
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
31
32
33
34
35
36
37
38
39
40
#include <stdio.h>
#include <strings.h>
 
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
 
int main()
{
    int pipefd[2];
    pipe(pipefd);
 
    pid_t pid;
 
    pid = fork();
 
    if (pid)
    {
        /* parent */
        int status;
        wait(&status);
 
        const int bufsize = 512;
        char buf[bufsize];
        bzero(buf, bufsize);
 
        read(pipefd[0], buf, bufsize);
 
        printf("Parent:\n");
        printf("%s\n", buf);
    }
    else
    {
        /* child */
        dup2(pipefd[1], STDOUT_FILENO);
        execlp("ls", "ls", "-l", NULL);
    }
 
    return 0;
}
0
танкист34
-62 / 0 / 0
Регистрация: 15.03.2013
Сообщений: 328
06.01.2014, 16:03  [ТС] #10
0x10, получается поток STDOUT процесса ls использует копию файлового дескриптора на запись?
или не так?
нашёл вот еще потоки STDIN_FILENO, STDOUT_FILENO и STDERR_FILENO
0
0x10
2475 / 1648 / 247
Регистрация: 24.11.2012
Сообщений: 4,069
06.01.2014, 16:12 #11
танкист34, у процесса есть набор файловых дескрипторов. Каждый дескриптор связан с записью в таблице файлов. Запись в таблице файлов связана с узлом ФС.
После вызова dup2 дескриптор, переданный вторым аргументом, начинает ссылаться на ту же запись в таблице открытых файлов, что и первый аргумент.
Ну это я в двух словах и довольно грубо. Подробно механизм расписан в книгах по программированию в юникс.
2
танкист34
-62 / 0 / 0
Регистрация: 15.03.2013
Сообщений: 328
16.01.2014, 20:22  [ТС] #12
а что делать, если в потоке окажется больше символов чем размер канала? т.е. ни что делать, а как определить сколько сиволов вернул поток STDOUT_FILENO?
0
0x10
2475 / 1648 / 247
Регистрация: 24.11.2012
Сообщений: 4,069
16.01.2014, 20:34 #13
При записи write возвращает количество успешно записаных байтов, read - количество прочитаных. Т.е. просто проверяйте значения.
1
танкист34
-62 / 0 / 0
Регистрация: 15.03.2013
Сообщений: 328
16.01.2014, 20:45  [ТС] #14
Цитата Сообщение от 0x10 Посмотреть сообщение
При записи write возвращает количество успешно записаных байтов, read - количество прочитаных. Т.е. просто проверяйте значения.
это-то да так и есть, но в вашем коде на первой странице получается в буфер записывает функция read, это значит надо смотреть сколько функция read прочитала с неименнованного канала. Вот.
Но мы то не знаем сколько она должна считать.. Мы же "помещаем данные в канал" dup2, а он не возвращает кол-во записанных. (он возвращает дескриптор)
Вот и вопрос: как узнать до каких пор считывать?
0
0x10
2475 / 1648 / 247
Регистрация: 24.11.2012
Сообщений: 4,069
16.01.2014, 20:56 #15
В данном конкретном случае можно предположить, что если мы прочитали меньше, чем указали в read, то это и считать за конец данных.
0
16.01.2014, 20:56
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.01.2014, 20:56
Привет! Вот еще темы с ответами:

Запуск программы без создания окна. Запуск фоновой программы - C++
Вопрос, как сделать, чтобы консольное приложение при запуске не создавало окошко консоли. Т.е. запустился процесс, но визуально ничего не...

Проверка процесса - C++
Мне нужен исходный код проверяющий работоспособность процесса , не как обычно из диспечера задач по имени а по пути фаила запуска ...

Распаралеливание процесса. - C++
Здравствуйте! у меня небольшая проблема. Небольшая преамбула: сейчас я пишу консольную игру(тапками не кидаться) по мотивам фильма...

Реакция на закрытие процесса - C++
А вопрос достаточно прост Из дочернего окна вызывается процесс - скажем ноутпад Хочется чтобы после закрытия процессa дочернее...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru