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

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

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

Author24 — интернет-сервис помощи студентам
Доброго вчемени суток
не так давно мной была создана тема касательно процессов
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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.12.2015, 11:16
Ответы с готовыми решениями:

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

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

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

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

21
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
01.12.2015, 13:41 2
Sibmax1988, здравствуйте. Ваше желание разгребать всё самому не может не радовать.
Тем не менее ваше решение не верно хотя бы потому, что
1. разделяя размер по байтам, вы легко попадаете в середину слова.
2. Не предусмотрен случай, если размер не делится на количество процессов нацело. Остаётся в конце несколько необработанных байт.
Коль преподаватель принял, то сойдет. Только в реальных задачах так не пишите.

Что касается пайпа, то из постановки задачи неясно, кто, что и кому должен передавать через канал. Уточните у преподавателя.
0
3 / 3 / 0
Регистрация: 22.09.2015
Сообщений: 124
01.12.2015, 13:46  [ТС] 3
gng, я так понял что родитель должен что то читать из файла и передавать считываемое процессу (1му) этот процесс принимает считываемое и обрабатывает, т е ищет нужную подстроку,и передавать результат в родительский, количество процессов дочерних задается в командной строке
а по поводу моего решение
ваще намного компактней но я не смог в нем разобраться если честно
и вывод мне нужно было получить в том виде в котором он был у меня а у вас он был в другом)
одним словом не смог разобрать ваш код)
0
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
01.12.2015, 13:51 4
Цитата Сообщение от Sibmax1988 Посмотреть сообщение
родитель должен что то читать из файла и передавать считываемое процессу (1му) этот процесс принимает считываемое и обрабатывает, т е ищет нужную подстроку, количество процессов дочерних задается в командной строке
Т.е. количество пайпов нужно открывать по количеству дочерних процессов и каждому передавать свою часть?
0
3 / 3 / 0
Регистрация: 22.09.2015
Сообщений: 124
01.12.2015, 13:58  [ТС] 5
мне кажется что количество пайпов может быть == количеству дочек
и да каждому передавать свою часть
не уверен просто что можно сделать с помощью одного пайпа

Добавлено через 1 минуту
желательно передалать мой вариант чтобы препод не задал вопрос типа зачем поменял логику и т п
я сам не могу сообразить что и как сделать нужно
0
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
01.12.2015, 20:55 6
Цитата Сообщение от Sibmax1988 Посмотреть сообщение
что количество пайпов может быть == количеству дочек
и да каждому передавать свою часть
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
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <malloc.h>
#include <sys/wait.h>
 
int main (int ac, char *av[]) {
  if (ac != 4) {
    printf ("Фомтат вызова: %s кол-во_процессов файл подстрока\n", av[0]);
    return 0;
  }
  FILE *f= fopen (av[2], "r");
  if (!f) return -1;
  int p_count= atoi (av[1]);
  int (*pd)[2]= malloc (p_count * sizeof(int[2])); // пайпы по кол-ву дочерних процессов
  int np;
  for ( np= 0; np < p_count; np++) {
    if (pipe (pd[np])) return -1;
    if (!fork()) break;
    close (pd[np][0]);
  }
  if (np == p_count) {
    char *lp= 0;
    size_t n= 0;
    int sz;
    for (np= 0; (sz= getline (&lp, &n, f)) > 0; np++) {
      if (np == p_count) np= 0;
      if (write (pd[np][1], lp, sz) != sz) return -1;
    }
    for (np= 0; np < p_count; np++) close (pd[np][1]);
    for (np= 0; np < p_count; np++)  wait(0);
  }
  else {
    close (pd[np][1]);
    char *buf= malloc (1000);
    int count= 0;
    for (int n= 0; read (pd[np][0], buf+n, 1) == 1 && n < 1000; n++) {
      if (*(buf+n) && *(buf+n) != '\n') continue;
      *(buf+n)= 0; n= -1;
      if (strstr (buf, av[3])) ++count;
    }
    free (buf);
    close (pd[np][0]);
    printf ( "Процесс %d: Кол-во совпадений - %d\n", getpid(), count);
  }
  return 0;
}
Погружаться в ваш код желания нет. Его всё равно надо исправлять хотя бы по указанным выше причинам.
Пробуйте разобраться. На каждую функцию есть руководство (ман). Что не понятно - спрашивайте.

Добавлено через 1 минуту
Bash
1
2
3
4
5
6
gg@c-1:~/cc/tmp$ ./a.out 5 pipe-cmp.c "int"
Процесс 9948: Кол-во совпадений - 0
Процесс 9947: Кол-во совпадений - 2
Процесс 9946: Кол-во совпадений - 2
Процесс 9945: Кол-во совпадений - 2
Процесс 9944: Кол-во совпадений - 3
0
3 / 3 / 0
Регистрация: 22.09.2015
Сообщений: 124
02.12.2015, 13:12  [ТС] 7
gng, можно услышать какие то комментарии потому задание сделано очень лаконично и я сам себе не могу ответить как работает ваш вариант
для начала не понятно что значит каждая переменная чтобы начать разбираться (ну вру не совсем каждая но половина)

Добавлено через 3 минуты
Цитата Сообщение от gng Посмотреть сообщение
int (*pd)[2]= malloc (p_count * sizeof(int[2])); // пайпы по кол-ву дочерних процессов
не понятна вот эта строка
как бы понятно что здесь описывается динамическое выделение памяти под пайп но не понятно зачем

Добавлено через 1 минуту
не могу понять где заканчивается родитель и начинается дочка

Добавлено через 2 минуты
не ясно вот это
C
1
(sz= getline (&lp, &n, f)) > 0;
ясно что считывается строка но с аргументами не понятно, опять же видимо из за не знания что значат переменные

Добавлено через 4 минуты
Цитата Сообщение от gng Посмотреть сообщение
for (int n= 0; read (pd[np][0], buf+n, 1) == 1 && n < 1000; n++) {
* * * if (*(buf+n) && *(buf+n) != '\n') continue;
* * * *(buf+n)= 0; n= -1;
* * * if (strstr (buf, av[3])) ++count;
* * }
не понятен алгоритм поиска нужного слова в считанной строке

Добавлено через 12 минут
Цитата Сообщение от gng Посмотреть сообщение
#define _GNU_SOURCE
что это?ни разу не сталкивался с этим

Добавлено через 59 минут
gng, объясни пожалуйста принцип разделения файла между дочерними процессами в предыдущей теме ссылка но которую в первом посте данной темы
не могу сообразить ни там не здесь
у меня то понятно просто побайтно файл поделен а у тебя не ясно как это делается(не ясно для меня именно)

Добавлено через 1 час 2 минуты
ну и да она у меня не компилируется ругается на динамическое выделение памяти под пайпы и на buf при описании

Добавлено через 1 минуту
ну и да она у меня не компилируется ругается на динамическое выделение памяти под пайпы и на buf при описании

Добавлено через 17 минут
/home/max/Документы/project/labnic2/laba4/laba4-3.c: In function ‘int main(int, char**)’:
/home/max/Документы/project/labnic2/laba4/laba4-3.c:17:49: error: invalid conversion from ‘void*’ to ‘int (*)[2]’ [-fpermissive]
int (*pd)[2]= malloc (p_count * sizeof(int[2])); // пайпы по кол-ву дочерних процессов
^
/home/max/Документы/project/labnic2/laba4/laba4-3.c:37:28: error: invalid conversion from ‘void*’ to ‘char*’ [-fpermissive]
char *buf= malloc (1000);

Добавлено через 4 часа 20 минут
Разобрался с malloc (не могу понять как он у вас запускался с таким описанием)
Программа работает не совсем корректно - если в одно строке искомое слово встречается больше одного раз то он второй раз счетчик не накручивает т е одно и то же слово в строке видит только один раз
0
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
02.12.2015, 13:56 8
Цитата Сообщение от Sibmax1988 Посмотреть сообщение
]int (*pd)[2]= malloc (p_count * sizeof(int[2])); // пайпы по кол-ву дочерних процессов
не понятна вот эта строка
как бы понятно что здесь описывается динамическое выделение памяти под пайп но не понятно зачем
Поскольку количество процессов заранее не известно, память под дескрипторы канала выделяется динамически.
pd - указатель на массив из двух интов.
Цитата Сообщение от Sibmax1988 Посмотреть сообщение
не могу понять где заканчивается родитель и начинается дочка
У родителя pd == p_count. У дочерних процессов - 0,1,2....p_count-1
Цитата Сообщение от Sibmax1988 Посмотреть сообщение
#define _GNU_SOURCE
что это?ни разу не сталкивался с этим
Макрос нужен для подключения некоторых функций из заголовка, напр. getline. Если ими не пользуетесь, то и макрос не нужен.
Цитата Сообщение от Sibmax1988 Посмотреть сообщение
ну и да она у меня не компилируется ругается на динамическое выделение памяти под пайпы и на buf при описании
/home/max/Документы/project/labnic2/laba4/laba4-3.c:17:49: error: invalid conversion from ‘void*’ to ‘int (*)[2]’ [-fpermissive]
Либо компилируйте Си (не плюсы)-компилятором, напр с ключём -std=c99, либо явно приведите тип возвращаемый malloc к тому, который просят.
... = (int (*)[2])mallic(...
Цитата Сообщение от Sibmax1988 Посмотреть сообщение
Программа работает не совсем корректно - если в одно строке искомое слово встречается больше одного раз то он второй раз счетчик не накручивает т е одно и то же слово в строке видит только один раз
Да, так и задумывалось. Если нужно по-другому, можно, например, разделять не по строкам, а по словам.
В сороковой строке, например:
C
1
if (isalnum(*(buf+n))) continue;
0
3 / 3 / 0
Регистрация: 22.09.2015
Сообщений: 124
02.12.2015, 14:01  [ТС] 9
Добавлено через 41 секунду
Цитата Сообщение от Sibmax1988 Посмотреть сообщение
for (int n= 0; read (pd[np][0], buf+n, 1) == 1 && n < 1000; n++) {
* * * if (*(buf+n) && *(buf+n) != '\n') continue;
* * * *(buf+n)= 0; n= -1;
* * * if (strstr (buf, av[3])) ++count;
* * }
не понятен алгоритм поиска нужного слова в считанной строке
объясните вот это не могу понять этот кусок кода
0
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
02.12.2015, 16:10 10
Цитата Сообщение от Sibmax1988 Посмотреть сообщение
не понятен алгоритм поиска нужного слова в считанной строке
объясните вот это не могу понять этот кусок кода
C
1
2
3
4
5
6
for (int n= 0; read (pd[np][0], buf+n, 1) == 1 && n < 1000; n++) { 
                                               // чтение из пайпа  в буфер по одному символу
  if (*(buf+n) && *(buf+n) != '\n') continue;  // если это не 0 и не '\n' читаем слудующий
  (buf+n)= 0; n= -1;                           // иначе заканчиваем строку в буфере
  if (strstr (buf, av[3])) ++count;            // не является ли заданное слово подстрокой строки в буфере
}
0
3 / 3 / 0
Регистрация: 22.09.2015
Сообщений: 124
02.12.2015, 19:39  [ТС] 11
gng, не ноль имеется ввиду пробел или как?не могу понять на слово складывается
И что такое bud+n точнее что такое плюс н
0
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
03.12.2015, 08:16 12
Цитата Сообщение от Sibmax1988 Посмотреть сообщение
ноль имеется ввиду пробел или как?
0 это ноль. Пробел - это читаемый символ.
buf - указатель на начало строки
buf + n - указатель на n-й байт строки
*(buf+n) - этот самый байт.

В данном примере с помощью strstr() просто проверяется, есть ли указанное сочетание символов в строке.
Если хотите именно слово, то используйте isalpha() или isalnum(), как я писал выше.

Добавлено через 10 часов 51 минуту
PS1. В посте10 4-я строка должна быть
*(buf+n)= 0; n= -1;
Переусердствовал, удаляя звездочки из поста 9.

PS2. *(buf+n) - это то же самое, что buf[n]
0
3 / 3 / 0
Регистрация: 22.09.2015
Сообщений: 124
03.12.2015, 08:41  [ТС] 13
gng, хоть убей не могу понять как слово формируется
вижу что работает а понять не могу
в том числе и эту строку
for (int n= 0; read (pd[np][0], buf+n, 1) == 1 && n < 1000; n++) {
// чтение из пайпа в буфер по одному символу
if (*(buf+n) && *(buf+n) != '\n') continue; // если это не 0 и не '\n' читаем слудующий
(buf+n)= 0; n= -1; // иначе заканчиваем строку в буфере
if (strstr (buf, av[3])) ++count;
берем первый символ из буфера если не 0 и не \n след итерация цикла пропуская то что написано в коде ниже и как слово сформировалось искомое не понимаю
0
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
03.12.2015, 09:53 14
Цитата Сообщение от Sibmax1988 Посмотреть сообщение
как слово сформировалось искомое не понимаю
Так оно и не формируется. Проверяется наличие подстроки, а слово это или фраза, или набор символов - не важно.
Видимо, вы хотите другого:
C
1
2
3
4
5
    for (int n= 0; read (pd[np][0], buf+n, 1) == 1; n++) {
      if (isalnum(buf[n])) continue;
      buf[n]= 0; n= -1;
      if (!strcmp (buf, av[3])) ++count;
    }
Так и количество слов будет правильно считаться, независимо от их расположения по строкам
Только имейте в виду - программа предполагает однобайтовые символы. С русскими буквами в utf-8 будут проблемы.
0
3 / 3 / 0
Регистрация: 22.09.2015
Сообщений: 124
03.12.2015, 12:44  [ТС] 15
gng, ну задание и есть с английскими символами и цифрами
только принцип работы формирования слова все равно не ясен
почитал про isalnum
"Функция isalnum проверяет параметр сharacter, через который передается целочисленное значение — эквивалент символа, является ли сharacter десятичной цифрой или символом алфавита, прописной или строчной буквой.
Если проверяемый параметр character десятичная цифра или буква верхнего или нижнего регистров, то результат выполнения функции — истина. В противном случае результат — ложь."
и не могу словить для себя как это происходит
в примере моей программы про форке я использовал сканф и с ним было понятно что он читает до пробела т е словами целиком и я мог сравнивать слова а здесь до самого принципа не могу дойти как оно слово собирает чтобы потом сравнить

Добавлено через 3 минуты
хотя может и понял
поправьте если я не прав
получается он берет один символ если это буква или цифра он загоняет ее в буфер пока не найдет пробел точку запятую и т п и потом как только находит вышеупомянутое то уже сравнивает с подстрокой искомой?

Добавлено через 4 минуты
только чтобы использовать функцию isalnum надо подключить сtupe.h а он отказывается это делать

Добавлено через 2 минуты
разобрался
опечатка на сайте
напишу вдруг кому пригодится
http://cppstudio.com/post/955/
должно быть ctype.h

Добавлено через 2 часа 29 минут
gng, начал просто играться с пайрами и форками и вообще ничего не рабтает объясните почему??
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
#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[])
{
  FILE *in;
  if (argc<3)
    {
      printf("Введите количество дочерних процессов и имя файла\n");
      exit (0);
    }
    char filename[256];
  int n=atoi(argv[2]);
  pid_t pid[n];
  int fd[2];
  printf("Количество дочерних процессов = %d\n",n );
  strcpy(filename,argv[1]);
  strcat(filename,".txt");
  if ((in=fopen (filename, "r"))==NULL)
    {
      printf("Нельзя открыть исходный файл.\n");
      exit(1);
    }
  if(pipe (fd)<0) {printf("Не могу создать канал\n");exit (0);}
printf("Родитель  %d\n", getpid() );
  char mas[256];
  for (int i=1; i<=n; i++)
    {    
      
     close (fd[0]);
      fgets (mas,256,in);
      //printf("Родитель %s\n %d\n",mas, getpid() );
      int size;
      size=write (fd[1], mas,10);
      printf("%d\n",size );
      close (fd[1]);
      pid[i]=fork();
      if (pid[i]==0)
        { 
          //printf("Дочка %s\n, %d\n",mas, getpid() );
          char remas[256];
          close (fd[1]);
          read (fd[0], remas, 10);
          printf("Дочка %s\n, %d\n",remas, getpid() );
          exit (-1);
          close(fd[0]);
        }
      else {printf("не могу создать дочерний процесс вернулосб %d\n", pid[i]); exit (0);}       
    }    
  sleep (3);
  //wait (0);
  for (int i=1; i<=1; i++)
    {
      waitpid(pid[i], NULL, WNOHANG);
    }  
    fclose(in); 
  return 0;
}
Добавлено через 1 минуту
причем и форк не понятно работает
я вообще не понимаю почему так происходит он и дочерний процесс делает и ошибку выдает
а пайпы вообще ничего не делают
а чем ошибка?
хочу разобраться а то в дальнейшем будут проблемы из за этого
0
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
03.12.2015, 15:13 16
Цитата Сообщение от Sibmax1988 Посмотреть сообщение
а чем ошибка?
Изучите руководство по fork()
Внимание уделите возвращаемому значению.
0
3 / 3 / 0
Регистрация: 22.09.2015
Сообщений: 124
03.12.2015, 17:16  [ТС] 17
gng, в том то и проблема что прочитал
Если вы посмотри код из первого самого поста то там сделано ровно так же и все работает а тут нет(
И Пайат тоже не работают
0
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
03.12.2015, 20:20 18
Цитата Сообщение от Sibmax1988 Посмотреть сообщение
C
1
2
3
4
5
6
7
8
9
10
11
12
pid[i]=fork();
if (pid[i]==0) { 
  //printf("Дочка %s\n, %d\n",mas, getpid() ); 
  char remas[256]; 
  close (fd[1]); 
  read (fd[0], remas, 10); 
  printf("Дочка %s\n, %d\n",remas, getpid() ); 
  exit (-1); 
  close(fd[0]); 
} 
else {printf("не могу создать дочерний процесс вернулосб %d\n", pid[i]); 
exit (0);} }
Дочерний процесс (форк возвращает ноль) читает из потока 10 символов, печатает их и завершается.
Родительский процесс (форк возвращает положительное число) печатает сообщение об ошибке и завершается.
В случае форсмажора (форк возвращает -1) дочерний процесс не создается, а родитель также печатает сообщение об ошибке и завершается.

Добавлено через 4 минуты
Напишите самый простой пример форка без циклов и пайпов и внимательно разберите.
0
3 / 3 / 0
Регистрация: 22.09.2015
Сообщений: 124
04.12.2015, 06:16  [ТС] 19
gng, мне ну
Цитата Сообщение от gng Посмотреть сообщение
Дочерний процесс (форк возвращает ноль) читает из потока 10 символов, печатает их и завершается.
Родительский процесс (форк возвращает положительное число) печатает сообщение об ошибке и завершается.
В случае форсмажора (форк возвращает -1) дочерний процесс не создается, а родитель также печатает сообщение об ошибке и завершается.
ну так так то и оно
дочерний создается (т е форк возвращает 0) и считывает из канала иначе бы ничего не печаталось но потом еще и сообщение об ошибке печатается
Цитата Сообщение от gng Посмотреть сообщение
Напишите самый простой пример форка без циклов и пайпов и внимательно разберите.
без циклов уже разобрал там то просто а во здесь не понимаю почему не работает
хотя повторюсь в первом посте этой темы форк сделан ровно точно так же и все работает
0
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
04.12.2015, 13:35 20
Цитата Сообщение от Sibmax1988 Посмотреть сообщение
во здесь не понимаю почему не работает
Я вам написал, что родительский процесс сразу же завершается после форка. Как это может работать???
Цитата Сообщение от Sibmax1988 Посмотреть сообщение
без циклов уже разобрал там то просто
Может и так, но ваш код говорит об обратном.
0
04.12.2015, 13:35
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.12.2015, 13:35
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru