0 / 0 / 0
Регистрация: 25.04.2012
Сообщений: 54
1

Передача данных между процессами (pipe)

25.04.2012, 19:35. Показов 15204. Ответов 29
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем доброго времени суток. Обращаюсь к вам с вопросиком. Передо мной стоит задача написать код, который:
1. Создавай процесс
2. организовывал между нами pipe
3. Передавал информацию от родительского процесса дочернему. Все хорошо, если бы не одно НО...Необходимо использовать ключи:
-i-ввод информации в файл (родителем). Если ключ не указан то стандартный ввод с клавиатуры
-o-вывод информации в выходной файл дочерним процессом
-r-перенаправление потока ошибок в прежде созданный текстовый файл (допустим list.txt)

ключи задаются при запуске программы, т.е. пример ./a.out -i inputfile-здесь используется входной с файл с информацией для передачи дочернему процессу

Начала писать код:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include....  
........  
int main(int argc, char *argv[]){  
 int input, output,pid  
 int fd[2]  
  
 input=0;  
 output=1;  
 for (i=1;i<argc;i++){  
  if (strcmp(argv[i],"-i")!=0){  
    i++;  
    input=open(argv[i],O_RDONLY);  
  }  
  if  (strcmp(argv[i],"-o")!=0){  
    i++;  
    unmask(0644);  
    output=open(argv[i],J_WRONLY|J_TRUNC|O_SYNC|O_CREAT,0644);  
  }  
  if  (strcmp(argv[i],"-r")!=0) {  
     fd1=open(log.txt,O_WRONLY,1);  
     dup2(fd1,2);  
  }
вот первая часть готова, в ней я проверяю введенный ключ.
Я так полагаю что дальше я создаю pipe, создаю процесс pid=fork и проверяю если pid>0, то что дальше делать????У меня есть переменные input и output нужно их как то использовать в зависимости от того дочернийй или родительский это процесс

ПОМОГИТЕ реализовать этот дальнейший код
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.04.2012, 19:35
Ответы с готовыми решениями:

Передача данных дочернему процессу посредством pipe(): иммитация нажатия enter через терминал
Всем привет. Столкнулся с такой проблемой: есть программа, считывающая логин и пароль...

Переключение между процессами
Здравствуйте! У меня вознкла проблемка с процесами. Стоит такая задачка: Процесс 1 открывает...

Обмен данными между процессами
Здравствуйте. Нужно создать три процесса.(fork()). У меня есть два варианта исхода событий: 1. -...

Семафоры. Работа между процессами
Пишу программу писатель-читатель на posix семафорах. Запускаю первый процесс, получаю на первой...

29
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
25.04.2012, 20:15 2
https://www.cyberforum.ru/c-li... ost2898253
https://www.cyberforum.ru/c-li... post973482
0
0 / 0 / 0
Регистрация: 25.04.2012
Сообщений: 54
25.04.2012, 20:24  [ТС] 3
Ссылки на данные файлы это немного не то что мне нужно. у меня работа с ключами. в зависимости от которых я создала переменные input и output которые изменяются в зависимости от ключа. Далее необходимо после форка распараллелить эти процессы:родитель должен что то писать а дочерний процесс что то читать. Нужно что бы поддерживался и ввод с клавиатуры и чтение из файла, а так же вывод полученных данных дочерним процессом либо на экран либо в файл. Не могу организовать это
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12835 / 7571 / 1765
Регистрация: 25.07.2009
Сообщений: 13,968
28.04.2012, 13:48 4
Цитата Сообщение от Nastya19kiss Посмотреть сообщение
if (strcmp(argv[i],"-i")!=0){
Функция strcmp() возвращает 0, если строки одинаковые, условие не верно задано.
0
0 / 0 / 0
Регистрация: 25.04.2012
Сообщений: 54
28.04.2012, 17:13  [ТС] 5
Мой вопрос был не в этом. а совсем в другом. что после цикла делать?
0
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
28.04.2012, 19:48 6
Цитата Сообщение от Nastya19kiss Посмотреть сообщение
Мой вопрос был не в этом. а совсем в другом. что после цикла делать?
вызываешь pipe, после этого делаешь fork. Для каждого процесса закрываешь неиспользуемые дескрипторы. Пишешь со стороны родителя вывод пайпа, читаешь со стороны потомка ввод пайпа.

Разбор параметров я бы организовал с помощью getopt.
0
0 / 0 / 0
Регистрация: 25.04.2012
Сообщений: 54
28.04.2012, 20:11  [ТС] 7
Спасибо за совет. вот после того как я закрыла для каждого процесса дискрипторы мне необходимо сделать цикл. Я использую while. А какое условие в while брать???У меня данные передаются блоками по 1Кб. И в этом цикле будут 2 функции Read(.....), Write(...).Я только предполагаю что в цикле будет так: while ....>0 и выполнение 2 функцию Только необходимо написать условие в цикле while. Помогите с этим пожалуйста
0
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
28.04.2012, 20:16 8
Цитата Сообщение от Nastya19kiss Посмотреть сообщение
while ....>0 и выполнение 2 функцию Только необходимо написать условие в цикле while. Помогите с этим пожалуйста
в принципе, да, только нужно еще учесть, что read может вернуть -1 при ошибке чтения, так что хорошо бы еще этот случай учесть:
C
1
2
3
4
5
6
7
8
9
10
ssize_t rd;                 /* число считанных байт (или -1 в случае ошибки read) */
while((rd = read(...)) > 0) /* условие цикла */
{
    /* тело цикла */
}
        
if(rd == -1)                /* проверка, не завершился ли вызов read ошибкой */
{
    /* обработка ошибки */
}
0
0 / 0 / 0
Регистрация: 25.04.2012
Сообщений: 54
03.05.2012, 16:24  [ТС] 9
Написала полный код моей программы:
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....  
........  
int main(int argc, char *argv[]){  
 int input, output,pid  
 int fd[2]  
  
 input=0;  
 output=1;  
 for (i=1;i<argc;i++){  
  if (strcmp(argv[i],"-i")!=0){  
    i++;  
    input=open(argv[i],O_RDONLY);  
  }  
  if  (strcmp(argv[i],"-o")!=0){  
    i++;  
    unmask(0644);  
    output=open(argv[i],J_WRONLY|J_TRUNC|O_SYNC|O_CREAT,0644);  
  }  
  if  (strcmp(argv[i],"-r")!=0) {  
     fd1=open(log.txt,O_WRONLY,1);  
     dup2(fd1,2);  
  }  
  pipe(fd);
  pid=fork();
  if (pid==-1) {
    write(1,"Error\n",10);
    exit(-1);
  }
  if (pid>0) {
    close(fd[0]);
    input=fd[1];
  } else {
       close(fd[1]);
       output=fd[0];
     }
  while(((rd=read(fd[0],&buf,1024))!=) {
    read(input,&buf,1024);
    write(output,&buf,1024)
  }
}
Проверьте пожалуйста мой код.
Вопросик есть еще: мне еще нужно выводить стандартный поток ошибок в файл log.txt предварительно созданный, как это сделать???
0
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
03.05.2012, 16:27 10
Цитата Сообщение от Nastya19kiss Посмотреть сообщение
Вопросик есть еще: мне еще нужно выводить стандартный поток ошибок в файл log.txt предварительно созданный, как это сделать???
выводи все ошибки (например, как в строке 26) в файловый дескриптор fd1, если он открыт.
0
0 / 0 / 0
Регистрация: 25.04.2012
Сообщений: 54
03.05.2012, 16:28  [ТС] 11
Дак я не знаю как, можешь примерчик написать

Добавлено через 41 секунду
как проверить открыт ли файловый дискриптор???
0
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
03.05.2012, 16:31 12
Цитата Сообщение от Nastya19kiss Посмотреть сообщение
Дак я не знаю как, можешь примерчик написать
C
1
write(fd1,"Error\n",strlen("Error\n"));
Цитата Сообщение от Nastya19kiss Посмотреть сообщение
как проверить открыт ли файловый дискриптор???
а проверять и необязательно. Можно сделать так:
  1. если указан аргумент -r, то присваивать fd1 результат open(log.txt,O_WRONLY,1)
  2. в противном случае присваиваем STDERR_FILENO
0
0 / 0 / 0
Регистрация: 25.04.2012
Сообщений: 54
03.05.2012, 16:37  [ТС] 13
Я не понимаю как это реализовать
0
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
03.05.2012, 16:38 14
Nastya19kiss, читай книжки, разбирайся; что я-то могу сделать, если ты не можешь написать простое условное выражение?
0
0 / 0 / 0
Регистрация: 25.04.2012
Сообщений: 54
03.05.2012, 16:39  [ТС] 15
fd1=STDERR_FILENO - я правильно поняла пункт 2 Вашего сообщения?
0
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
03.05.2012, 16:40 16
Nastya19kiss, да. Но это только если не указан аргумент -r
0
0 / 0 / 0
Регистрация: 25.04.2012
Сообщений: 54
03.05.2012, 16:46  [ТС] 17
А если я добавлю в программу условие типа
C
1
2
3
4
5
if (rd < 0)
    {
        fprintf (stderr, "myread: Cannot read file\n");
        exit (1);
    }
То программа будет перенаправлять поток ошибок в файл?
0
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
03.05.2012, 16:48 18
Nastya19kiss, еще раз забудешь проставить тег [C][/C] у кода — получишь карточку


Цитата Сообщение от Nastya19kiss Посмотреть сообщение
А если я добавлю в программу условие типа Код C
[skipped]
То программа будет перенаправлять поток ошибок в файл?
нет конечно, ты ведь указала стандартный поток ошибок
0
0 / 0 / 0
Регистрация: 25.04.2012
Сообщений: 54
03.05.2012, 16:59  [ТС] 19
Я так понимаю что не нужно использование функции dup2()?
0
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
03.05.2012, 17:07 20
Nastya19kiss, нет, не нужно. Для ошибок можно сразу использовать поток, создаваемый функцией fopen
0
03.05.2012, 17:07
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.05.2012, 17:07
Помогаю со студенческими работами здесь

Обмен данными между процессами с использованием сообщений
Добрый день, форумчане! Помогите, пожалуйста, разобраться с данным видом взаимодействия процессов....

Вызовы read/write в цикле между процессами
Необходимо реализовать два процесса: родительский считывает N чисел по одному и пишет их потомку, а...

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

Передача данных между процессами. Использование каналов
Написать приложение (клиент), которое передает математическое выражение, а второе (сервер)...


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

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

Новые блоги и статьи
В чем отличие между INNER JOIN и OUTER JOIN
bytestream 22.01.2025
В современных базах данных информация часто распределена между множеством взаимосвязанных таблиц, что делает операции объединения JOIN неотъемлемой частью работы с SQL. Эти операции позволяют. . .
Как сделать первую букву заглавной в JavaScript
bytestream 22.01.2025
JavaScript предоставляет разработчикам множество инструментов для эффективной работы с текстовыми данными. Одной из часто встречающихся задач при обработке строк является преобразование первой буквы. . .
Что такое Big O нотация и алгоритмическая сложность
bytestream 22.01.2025
Введение в алгоритмическую сложность В мире разработки программного обеспечения эффективность алгоритмов играет crucial роль в создании качественных приложений. Алгоритмическая сложность. . .
Как решать конфликты объединения (merge) в Git
bytestream 22.01.2025
Что такое конфликты слияния Конфликты слияния в системе контроля версий Git возникают в ситуациях, когда две или более ветки разработки содержат несовместимые изменения в одних и тех же участках. . .
Как использовать регулярные выражения
bytestream 22.01.2025
Регулярные выражения представляют собой мощный инструмент для работы с текстовыми данными, который позволяет осуществлять поиск, проверку и манипуляцию строками на основе определенных шаблонов. Этот. . .
Как выйти из Vim
bytestream 22.01.2025
Vim (Vi IMproved) представляет собой один из самых влиятельных текстовых редакторов в истории компьютерной индустрии, эволюционировавший из своего предшественника Vi, созданного Биллом Джоем в 1976. . .
NoSQL базы данных: что это такое и какие существуют
bytestream 22.01.2025
В современную эпоху цифровой трансформации объемы данных растут экспоненциально, создавая новые вызовы для традиционных систем управления базами данных. NoSQL (Not Only SQL) представляет собой. . .
Обновление исследования от команды MCM (январь 2025 г.)
Programma_Boinc 22.01.2025
Обновление исследования от команды MCM (январь 2025 г. ) Мы продолжаем изучать молекулярные сигнатуры, связанные с раком легких, с текущим фокусом на GCM1, факторе транскрипции, участвующем в. . .
Как работать с Kafka в Go (Golang)
bytestream 22.01.2025
Apache Kafka представляет собой распределенную платформу потоковой передачи данных, которая произвела революцию в области обработки событий и интеграции микросервисов. Эта система, изначально. . .
Как использовать RabbitMQ в Go (Golang)
bytestream 22.01.2025
RabbitMQ представляет собой надежный и широко используемый брокер сообщений, который играет ключевую роль в построении современных распределенных систем и микросервисной архитектуры. В основе работы. . .
Как преобразовать список списков в простой список в Python
bytestream 22.01.2025
При работе с Python разработчики часто сталкиваются с необходимостью обработки сложных структур данных, среди которых особое место занимают вложенные списки. Эти структуры представляют собой списки,. . .
Что такое GUID / UUID и как их создать
bytestream 22.01.2025
В мире разработки программного обеспечения существует постоянная потребность в уникальной идентификации объектов, записей и ресурсов. Эта задача становится особенно актуальной в распределенных. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru