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

Именованные и неименованные каналы в UNIX

02.05.2023, 21:07. Показов 1391. Ответов 1

Студворк — интернет-сервис помощи студентам
Здравствуйте, суть программы заключается в том, чтобы запустить следующий конвейер:
ls -la /dev | sort | more
В программе могут использоваться вызовы функций fork(),exec*(),wait(),exit(),pipe(). Я написал только "ls -la /dev | more", но как добавить sort никак не могу найти.

Мой код написан в тупую, не спорю, но вроде как даже работает. Хотелось бы все таки понять, как добавить второй fork(), либо что-то другое. В интернете ничего подобного не нашел, надеюсь, что вы как-то сможете мне помочь и поставите на верный путь!)

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
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
 
int main()
{
    int fd[2];
    pipe(fd);
    
    if (fork())
    {
        close(0);
        dup2(fd[0], 0);
        close(fd[0]):
        close(fd[1]);
        execl("/bin/more", "more", 0);
    }   
    close(1);
    dup2(fd[1],1);
    close(fd[1]);
    close(fd[0]);
    excel("/bin/ls", "ls", "-la", "/dev", 0);
    
    return 0;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.05.2023, 21:07
Ответы с готовыми решениями:

Неименованные каналы POSIX
Всем привет, делаю лабу по операционным системам. Не понимаю один момент. Задание: Родительский процесс создаёт два дочерних...

Именованные каналы
Родитель передает три строки, потомок возвращает их, отсортировав в лексикографическом порядке. Реализовать через такое средство...

Именованные каналы в Linux
Прошу помощи с именованными каналами . Нужно передать данные от 1-го процесса в 2-ой . В 1-ом процессе вводятся данные , а во 2-ом они...

1
7 / 6 / 1
Регистрация: 26.12.2019
Сообщений: 71
04.05.2023, 23:28
Доброго времени суток !

про dup2 вы уже знаете, но пользоваться не умеете ничего это поправимо !
У вас при запуске процесса есть 3 открытых файла stdin(0), stdout(1) b stderr(2), в скобках номера файловых дескрипторов.
Функция exec подменяет текущий процесс - новым, но начальную троицу не меняет.
Теперь рассмотрим вашу задачу - вам необходимо запустить процесс ls, где stdout(1) перенаправить в pipe, далее запустить процесс sort у которого уже будут перехвачены и stdin(0) и stdout(1). stdin(0) это будет второй конец пайпа от stdout(1) процесса ls, а stdout(1) процесса sort должен уходить в stdin(0) процесса more. stdout(1) more остается неизменным что бы мы могли видеть результат на экране.
итого нам понадобятся 2 пайпа, а не 1.

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
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
 
int main()
{
    int pipe0[2], pipe1[2];
    pipe(pipe0);
    pipe(pipe1);
    
    if (!fork())
    {
        // Первый форк, нам нужно подменить stdout(1) на pipe0[1];
        dup2(pipe0[1], 1); // с этого момента stdout(1) является pipe0[1];
        execl("/bin/ls", "ls", "-la", "dev/", NULL);
 
    }
    if (!fork())
    {
        // Во втором форке (sort) нам уже нужно подменить 2 потока stdin(0) и stdout(1)
        dup2(pipe0[0], 0);
        dup2(pipe1[1], 1);
        execl("/bin/sort", "sort", NULL);
 
    }
    if (!fork())
    {
        // В третьем форке нам нужно заменить только stdin(0). А stdout(1) нужно оставить как есть
        // что бы остался выводом в консоль
        dup2(pipe1[0], 0);
        execl("/bin/more", "more", NULL);
 
    }
    return 0;
}
Вот собственно и всё.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
04.05.2023, 23:28
Помогаю со студенческими работами здесь

Именованные каналы в Linux. mkfifo
Всем доброго времени суток. Друзья, где в какой книге можно почитать про Именованные каналы в Linux? только не работа с терминалом а...

Именованные и неименованные константы
Друзья, здравствуйте! Не понимаю, что из себя представляют неименованные константы. Именованные - это const тип переменная =...

Неименованные каналы
Привет всем! Подскажите, пожалуйста, как работать с неименованными каналами. Может есть какие-то примеры? Как использовать...

Именованные каналы
у CreateNamePipe() есть параметр nMaxInstances. то есть &quot;The maximum number of instances that can be created for this pipe&quot;. я...

Именованные каналы
Доброе время суток. Мне нужно написать именованый канал между С++ и МТ5. На просторах интернета я нашел данную программу под VisualStudio,...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
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
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru