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

Pipe и все иже с ним

01.12.2015, 11:16. Показов 4878. Ответов 21
Метки нет (Все метки)

Доброго вчемени суток
не так давно мной была создана тема касательно процессов
https://www.cyberforum.ru/c-li... ost8403530
один и участников форума решил поставленную задачу (за что ему безграничное спасибо), НО я не став заниматься копипастом написал свой вариант решения который выглядит вот так

Родительский файл
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <wait.h>
#include <sys/stat.h>
 
int main(int argc, char* argv[])
{
  int n, total=0, result=0, finish,temp;
  char filename[256];
  char str[2], strpos[6], strstart[6];
  int position, start=0;
  FILE *in;
  if (argc<4)
    {
      printf("Введите количество дочерних процессов и имя файла\n");
      exit (0);
    }
  n=atoi(argv[2]);
  pid_t pid[n];
  printf("Количество дочерних процессов = %d\n",n );
  strcpy(filename,argv[1]);
  strcat(filename,".txt");
  if ((in=fopen (filename, "r"))==NULL)
    {
      printf("Нельзя открыть исходный файл.\n");
      exit(1);
    }
  fseek (in, 0, SEEK_END);
  int size = ftell(in);
  printf("Размер текстового файла %d байт\n",size );
  int diap=size/n;
  printf ("Размер читаемой области для каждого процесса %d байт\n", diap);
  fclose(in);
 
  for (int i=1; i<=n; i++)
    {
      sprintf (str, "%d", i);
      position=diap*i;
      sprintf (strpos, "%d", position);
      sprintf (strstart, "%d", start);
      pid[i]=fork();
      if (pid[i] == 0)
        {
          if (execl ("./laba3-2", "laba3-2",argv[1],argv[3],str,strpos,strstart, NULL)<0)
            {
              printf( "Создание процесса провалено.\n" );
              exit(0);
            }
        }
      start=atoi(strstart);
      start=start+diap;
    }
 
  sleep (2);
  for (int i=1; i<=n; i++)
    {
      finish=waitpid(pid[i], &result, WNOHANG);
      if (pid[i]==finish)
        {
          printf("Область файла %s.txt проверена процессом %d количество совпадений %d\n",argv[1],pid[i],WEXITSTATUS(result));
          total+=result;
        }
    }
  return 0;
}
Дочерний файл

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
#include <stdio.h>
#include   <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
 
int main(int argc, char* argv[])
{
  char filename[256], str[256];
  FILE *in;
  int   count = 0, nomer = 0;
  strcpy(filename,argv[1]);
  strcat(filename,".txt");
  if ((in=fopen (filename, "r"))==NULL)
  {
     printf("Нельзя открыть исходный файл.\n");
     exit(1);
  }
  int nomerproc=atoi(argv[3]);
  int strpos=atoi(argv[4]);
  int strstart=atoi(argv[5]);
  int size=1;
  fseek (in, strstart, SEEK_SET);  
  char line[20];
  strcpy(line,argv[2]);
  while ((size <= strpos) && (!feof(in)))
    {
      fscanf (in, "%s\n", str);
      nomer++;
      if (strcmp(str, line) == 0)
        {
          count++;
          printf("(Процессом с ID : %d) - в файле %s.txt найдено искомое слово в тексте: %s\n",getpid(), argv[1], line);                 
        }
        size = ftell(in);
      }
  fclose(in);
  return count;
}
и эта работа была принята преподавателем и я успешно перешел к работе над следующей работой и там столкнулся с такой вещью как pipe fifo и т п
суть задачи в том чтобы переделать программу выше с помощью pipe . т е как объяснил препод избавиться от execl и решить задачу с помощью pipe таким образом дочерний файл оказался не нужным
я переписал программу чтобы все работало без дочернего файла

новая версия
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <wait.h>
#include <sys/stat.h>
 
int main(int argc, char* argv[])
{
  int n, total=0, result=0, finish;
  char filename[256],line[20];char str[256];
  int position, start=0, count=0;
  FILE *in;
  if (argc<4)
    {
      printf("Введите количество дочерних процессов и имя файла\n");
      exit (0);
    }
  n=atoi(argv[2]);
  pid_t pid[n];
  printf("Количество дочерних процессов = %d\n",n );
  strcpy(filename,argv[1]);
  strcat(filename,".txt");
  if ((in=fopen (filename, "r"))==NULL)
    {
      printf("Нельзя открыть исходный файл.\n");
      exit(1);
    }
  fseek (in, 0, SEEK_END);
  int size = ftell(in);
  printf("Размер текстового файла %d байт\n",size );
  int diap=size/n;
  printf ("Размер читаемой области для каждого процесса %d байт\n", diap);
  strcpy(line,argv[3]);
  for (int i=1; i<=n; i++)
    {    
      pid[i]=fork();
      if (i==1) start=0;
      else start+=diap;
      if (pid[i] == 0)
        {             
          size=1;
          fseek (in, start, SEEK_SET);
          position=diap*i;          
          while ((size <= position) && (!feof(in)))
          {            
            fscanf (in, "%s\n", str);
            if (strcmp(str, line) == 0)
                {
                  count++;
                  printf("(Процессом с ID : %d) - в файле %s.txt найдено искомое слово в тексте: %s\n",getpid(), argv[1], line);
                }
            size = ftell(in);
          }                       
          return count;  
        }       
    }    
  sleep (1);
  for (int i=1; i<=n; i++)
    {
      finish=waitpid(pid[i], &result, WNOHANG);
      if (pid[i]==finish)
        {
          printf("Область файла %s.txt проверена процессом %d количество совпадений %d\n",argv[1],pid[i],WEXITSTATUS(result));
          total+=result;
        }
    }   
    fclose(in); 
  return 0;
}
но вот проблема не могу догадаться как прикрутить сюда pipe
искренне надеюсь на вашу помощь
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.12.2015, 11:16
Ответы с готовыми решениями:

AJAX и иже с ним
Доброго времени суток, господа программисты. У меня следующая проблема: есть игра (в рамках проектной работы по одной дисциплине),...

Combobox и иже с ним
Здравствуйте, уважаемые. Необходима помощь и разъяснения начинающему...в приложенном файле не могу записать 2 раза подряд информацию из...

Sfinae и иже с ним
здравствуйте, дабы лучше разобраться с шаблонами решил сделать функцию, печатающую все элементы либо контейнера, либо массива. чтобы...

21
92 / 19 / 4
Регистрация: 11.04.2015
Сообщений: 1,019
Записей в блоге: 1
06.12.2015, 09:29
gng, спасибо за ваш пример. Я тут в соседней теме разбираюсь с тредами и пайпами, попробую делать аллокацию памяти.

По теме - по моему количество пайпов должно быть равно количеству процессов минус 1. Иначе куда последний процесс будет данные передавать?
0
0 / 0 / 0
Регистрация: 17.12.2020
Сообщений: 4
19.12.2020, 05:37
gng, привет, можете реализовать Ваш пример через FIFO? я как не старался не получается.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.12.2020, 05:37

OrderBy() и иже с ним
есть такой код static List&lt;string&gt; strout = new List&lt;string&gt;(); StreamWriter writer = new StreamWriter(@&quot;c:\bits.txt&quot;); ... ...

Магнитная мешалка и иже с ним
Здравствуйте уважаемые форумчане! По рабочим нуждам необходимо собрать в лабораторию магнитную мешалку. Вопрос мой будет связан...

FireDAC и иже с ним. Работа с SQLite
Доброго времени суток! История конечно печальна) Установил XE6 из за любопытства да и из за кроссплатформенности под ведро! ставился...

После установки сомнительной программы куча мусора в виде известного браузера и иже с ним
Открывает рекламу, меняет поисковые системы и прочие пакости! Помогите, пожалуйста! Встала вся работа :((

Геймдев и всё, что с ним связанно
Всем привет. Учусь в 9 классе. В последнее время нравится программирование и физика. Хочется заняться геймдевом, но т.к с 6-8 класс на...


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

Или воспользуйтесь поиском по форуму:
22
Ответ Создать тему
Новые блоги и статьи
24 Мат модель здравосохранения: функциональные требования к строительству пищеблока
anaschu 18.06.2026
СРесурсами1: финансовый SD-контур, калькулятор функциональных требований пищеблока Сегодня разделили затраты в агенте Экономика по образцу модели НАСОСЫ, добавили расчёт ROI и построили первый. . .
23. что сделано за последнее время.
anaschu 17.06.2026
• Эталон: Клиника НИИ питания РАМН, Москва — централизованный пищеблок, 225 коек, 180 пациентов • Git: репозиторий med2, ветка абсентеизм. Рабочий файл: СРесурсами1_v4. alp • Смежный проект:. . .
22. Подключение слоя системной динамики (потоковые диффуры): экономические метрики модели
anaschu 17.06.2026
Апдейт модели: финансовый контур, разделение затрат Продолжаю развивать модель рабочего коллектива на AnyLogic. В этот раз работа шла над агентом Экономика — финансовым SD-слоем модели. Задача:. . .
[golang] Insert Delete GetRandom O(1) (Leetcode: 380)
alhaos 16.06.2026
Insert Delete GetRandom O(1) Сложность: Medium Источник: LeetCode 380 Задача Реализовать структуру данных RandomizedSet, которая поддерживает следующие операции за O(1) в среднем:
Свет в конце тоннеля
kumehtar 16.06.2026
Поймал себя на одной мысли. Раньше мне всегда казалось неправильным жить без чёткого понимания, куда всё идёт. Будто я иду по дороге судьбы, но не знаю, куда она ведёт. А раз не знаю — значит,. . .
[golang] Реализация стека с поддержкой получения минимального элемента за O(1)
alhaos 16.06.2026
Min Stack Сложность: Medium Источник: LeetCode 155 Задача: Реализовать стек который поддерживает push, pop, top и получение минимального элемента за O(1). Методы:
[golang] Конкурентный fetcher с ограничением максимального количества одновременных HTTP запросов.
alhaos 10.06.2026
Задача Реализовать конкурентный fetcher с ограничением максимального количества одновременных HTTP запросов. Сигнатура func Fetch(urls string, maxConcurrent int) Result Пример urls :=. . .
[golang] Состояние гонки (race condition)
alhaos 10.06.2026
Состояние гонки (race condition) Состояние гонки (Race Condition) — это ошибка, возникающая при одновременном доступе нескольких горутин к одним и тем же данным без должной синхронизации. При этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru