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

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

02.02.2014, 16:51. Показов 11662. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение Это мой обзор планшета X220 с точки зрения школьника. Недавно я решила попытаться уменьшить свой. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru