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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
танкист34
-62 / 0 / 0
Регистрация: 15.03.2013
Сообщений: 328
05.01.2014, 18:16     Запуск процесса #1
Здравствуйте! Как получить данные из потока 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]
Всем спасибо
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.01.2014, 18:16     Запуск процесса
Посмотрите здесь:

Поиск процесса на c++ C++
C++ Проверка процесса
C++ Запуск и остановка дочернего процесса
Распаралеливание процесса. C++
C++ Запуск параллельного процесса
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Байт
 Аватар для Байт
14004 / 8835 / 1234
Регистрация: 24.12.2010
Сообщений: 16,014
05.01.2014, 19:18     Запуск процесса #2
Цитата Сообщение от танкист34 Посмотреть сообщение
Как получить данные из потока stderr и стандартного потока вывода процесса?
Перенаправь выводы в файлы и читай
C
1
system("ls -l >a.txt 2>err.txt");
танкист34
-62 / 0 / 0
Регистрация: 15.03.2013
Сообщений: 328
05.01.2014, 19:45  [ТС]     Запуск процесса #3
Байт , спасибо, но это не то=)) мне процесс надо запускать именно так как я указал в теме, а system просто передаёт управление командному интерпретатору. Допустим, потребуется 10 процессов запустить и они будут выполняться последовательно, что мне не нужно. Мне необходимо параллельно 10 запустить, а уже потом с каждого получать информацию, но проблема не с запуском, а как работать с потоками(вывода) процессов.
Я для примера привёл запуск, чтобы узнать как упростить мой код.
Байт
 Аватар для Байт
14004 / 8835 / 1234
Регистрация: 24.12.2010
Сообщений: 16,014
05.01.2014, 20:01     Запуск процесса #4
танкист34, вопрос понял. Вот в Qt есть такой класс QProcess. И он умеет как запускать процессы (асинхронно), так и перехватывать их вывод, и все очень просто. В Си под Линухом, видимо, тоже такие механизмы есть, работа с каналами ввода-вывода - одна из фишек иксов, но тогда тебе надо в другой раздел.
танкист34
-62 / 0 / 0
Регистрация: 15.03.2013
Сообщений: 328
06.01.2014, 03:31  [ТС]     Запуск процесса #5
Цитата Сообщение от Байт Посмотреть сообщение
танкист34, вопрос понял. Вот в Qt есть такой класс QProcess. И он умеет как запускать процессы (асинхронно), так и перехватывать их вывод, и все очень просто. В Си под Линухом, видимо, тоже такие механизмы есть, работа с каналами ввода-вывода - одна из фишек иксов, но тогда тебе надо в другой раздел.
в какой раздел? тему же вроде нельзя дублировать?
Байт
 Аватар для Байт
14004 / 8835 / 1234
Регистрация: 24.12.2010
Сообщений: 16,014
06.01.2014, 12:12     Запуск процесса #6
Цитата Сообщение от танкист34 Посмотреть сообщение
в какой раздел?
http://www.cyberforum.ru/cpp-linux/
http://www.cyberforum.ru/c-linux/
Цитата Сообщение от танкист34 Посмотреть сообщение
тему же вроде нельзя дублировать?
Ну, назови ее как-то иначе. И оформи по-другому. С учетом того, что в стартовой формулировке не все однозначно. Подчеркни, что требуется асинхронность и именно работа с каналами в/в. И вообще поищи информацию об этих каналах. Чем больше ты будешь знать, тем точнее сформулируешь вопрос, тем больше шансов получить внятный ответ.
Можно еще ссылку дать на этот топик.
И это будет не дублирование темы, а ее развитие.
0x10
2426 / 1598 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
06.01.2014, 12:16     Запуск процесса #7
Первая же мысль: man 2 pipe
танкист34
-62 / 0 / 0
Регистрация: 15.03.2013
Сообщений: 328
06.01.2014, 12:46  [ТС]     Запуск процесса #8
Цитата Сообщение от 0x10 Посмотреть сообщение
Первая же мысль: man 2 pipe
ну pipe это само собой разумеется, проблема в том, что я не знаю что туда записывать, т.е. как с запущенного процесса получить данные...
спасибо за ответ
0x10
2426 / 1598 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
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;
}
танкист34
-62 / 0 / 0
Регистрация: 15.03.2013
Сообщений: 328
06.01.2014, 16:03  [ТС]     Запуск процесса #10
0x10, получается поток STDOUT процесса ls использует копию файлового дескриптора на запись?
или не так?
нашёл вот еще потоки STDIN_FILENO, STDOUT_FILENO и STDERR_FILENO
0x10
2426 / 1598 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
06.01.2014, 16:12     Запуск процесса #11
танкист34, у процесса есть набор файловых дескрипторов. Каждый дескриптор связан с записью в таблице файлов. Запись в таблице файлов связана с узлом ФС.
После вызова dup2 дескриптор, переданный вторым аргументом, начинает ссылаться на ту же запись в таблице открытых файлов, что и первый аргумент.
Ну это я в двух словах и довольно грубо. Подробно механизм расписан в книгах по программированию в юникс.
танкист34
-62 / 0 / 0
Регистрация: 15.03.2013
Сообщений: 328
16.01.2014, 20:22  [ТС]     Запуск процесса #12
а что делать, если в потоке окажется больше символов чем размер канала? т.е. ни что делать, а как определить сколько сиволов вернул поток STDOUT_FILENO?
0x10
2426 / 1598 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
16.01.2014, 20:34     Запуск процесса #13
При записи write возвращает количество успешно записаных байтов, read - количество прочитаных. Т.е. просто проверяйте значения.
танкист34
-62 / 0 / 0
Регистрация: 15.03.2013
Сообщений: 328
16.01.2014, 20:45  [ТС]     Запуск процесса #14
Цитата Сообщение от 0x10 Посмотреть сообщение
При записи write возвращает количество успешно записаных байтов, read - количество прочитаных. Т.е. просто проверяйте значения.
это-то да так и есть, но в вашем коде на первой странице получается в буфер записывает функция read, это значит надо смотреть сколько функция read прочитала с неименнованного канала. Вот.
Но мы то не знаем сколько она должна считать.. Мы же "помещаем данные в канал" dup2, а он не возвращает кол-во записанных. (он возвращает дескриптор)
Вот и вопрос: как узнать до каких пор считывать?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.01.2014, 20:56     Запуск процесса
Еще ссылки по теме:

Запуск программы без создания окна. Запуск фоновой программы C++
Отловить запуск процесса C++
C++ Запуск процесса из С++

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

Или воспользуйтесь поиском по форуму:
0x10
2426 / 1598 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
16.01.2014, 20:56     Запуск процесса #15
В данном конкретном случае можно предположить, что если мы прочитали меньше, чем указали в read, то это и считать за конец данных.
Yandex
Объявления
16.01.2014, 20:56     Запуск процесса
Ответ Создать тему
Опции темы

Текущее время: 04:44. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru