Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/56: Рейтинг темы: голосов - 56, средняя оценка - 4.82
0 / 0 / 0
Регистрация: 02.02.2014
Сообщений: 3

Конвейер команд для нескольких процессов

02.02.2014, 16:51. Показов 11694. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте все.
Моя задача: написать конвейер команд. Из командной строке поступает команды, разделенные символом |.

команда 1 | команда 2 | ..... | команда N

Надо, что бы команда 1 на вход брала стандартный поток ввода, команда 2 брала на вход вывод команды 1 и так далее.

Это кусок из main():
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
process[iter] = getcmd(catalog); 
 
    while (confl)
    {
           conveer(iter);
       povt++;
       confl=0;
       process[iter] = getcmd(catalog);
       if (confl == 0) 
        {
         conveer(iter); 
        }
    }
getcmd - возвращает аккуратную структуру, где process[iter]-> name - имя команды
process[iter]->cmd_mass - массив char** ее аргументов
Флаг confl поднимается, если в конце строки встретился символ конвейера.


Сама функция conveer();

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
  void conveer(int i)
            {
                pid_t pid1;
                            
                pipe(fds[i]);
                pid1 = fork();
                if (pid1 == 0)
                {
                    
                    if (i!=0)  dup2(fds[i-1][1], 0);
                    if (confl) dup2(fds[i][1], 1);
                    
                    close(fds[i-1][0]);
                    close(fds[i][1]);
 
                    
                    execvp(process[i]->name,process[i]->cmd_mass);
                }
                close(fds[i-1][0]);
                close(fds[i][1]);
 
                
                    if (!confl) waitpid(pid1, NULL, 0);
                    if (i!=0) close(fds[i-1][1]);
                return;
            }
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.02.2014, 16:51
Ответы с готовыми решениями:

Запуск нескольких процессов и Анализ переключения между ними
Не могу разобраться, наверное я слишком тормоз...%-) Задание: написать программу которая создаёт несколько процессов(в моём случае 2) и...

Распараллеливание процессов: реализовать инвертирование содержимого файлов из нескольких подкаталогов
Добрый день нужно реализовать программу инвертирования содержимого файлов из нескольких подкаталогов (каждый процесс работает со своим...

Конвейер команд: DIR без ключей и FIND
Здравствуйте! Предварительно создайте каталог Примеры, а в нём - несколько подкаталогов и файлов. Выполните запись в файл FileInfo.txt...

5
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
02.02.2014, 17:51
Пример реализации для связки "ls | wc"
https://www.cyberforum.ru/c-li... post973482
0
0 / 0 / 0
Регистрация: 02.02.2014
Сообщений: 3
02.02.2014, 18:31  [ТС]
Цитата Сообщение от Evg Посмотреть сообщение
Пример реализации для связки "ls | wc"
https://www.cyberforum.ru/c-li... post973482
Да, в общем там это реализовано для двух команд. Когда их много, все намного сложнее. Я выше написал, в чем проблема.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
02.02.2014, 22:03
Если ты и описал проблему, то я этого не увидел ничего кроме "мне надо сделать, сделайте кто-нибудь"

Одним каналом (ты назвал "конвейер") связываешь выход одной программы со входом второй. Вторым каналом - выход второй со входом третей и т.п.
0
0 / 0 / 0
Регистрация: 02.02.2014
Сообщений: 3
02.02.2014, 23:20  [ТС]
Цитата Сообщение от Evg Посмотреть сообщение
Если ты и описал проблему, то я этого не увидел ничего кроме "мне надо сделать, сделайте кто-нибудь"

Одним каналом (ты назвал "конвейер") связываешь выход одной программы со входом второй. Вторым каналом - выход второй со входом третей и т.п.
Я не прошу сделать, я прошу указать на ошибку.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
03.02.2014, 00:03
Сложно указать на ошибку, видя только огрызок исходника.

Если ты посмотришь на программу по ссылке, то увидишь, что для одного конвейера должен быть один вызов pipe и два вызова fork. Т.е. всего должно быть три процесса: два процесса, связанных конвейером и наш процесс, который это дело стартует. Для двух конвейеров будет два вызова pipe и три вызова fork
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.02.2014, 00:03
Помогаю со студенческими работами здесь

Обработка выбора для нескольких команд
Как правильно организовать обработку выбора для двух ТЧ ( у каждой есть кнопка подбор) Для первой ТЧ &НаКлиенте Процедура...

Создание общих параметров для нескольких команд
Программа по некоторому принципу обрабатывает БД. Пусть есть две команды, одна из них добавляет строки в базу, другая обновляет их. Обе...

Pipe для нескольких процессов
Народ подскажите можно ли использовать именной pipe FIFO более, чем для 2 процессов? Для того, чтобы с помощью компьютера управлять одной...

Программа для запуска нескольких процессов
Применительно к операционной системе Windows. Пусть в некотором конфигурационном файле содержится список процессов, которые необходимо...

запуск нескольких команд
здрст товарищи линускоиды, можна ли както запустить несколько команд которые записаны в одной строке хочу на плэер xmms2 создать...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru