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

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

01.12.2015, 11:16. Показов 4805. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Видеокарта простаивает ночами? Вот 4 проекта, которые загрузят её наукой
Programma_Boinc 10.04.2026
Видеокарта простаивает ночами? Вот 4 проекта, которые загрузят её наукой Если на Windows стоит дискретная NVIDIA или AMD — можно отдать её вычислительную мощность реальным исследованиям. . . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru