3 / 3 / 0
Регистрация: 22.09.2015
Сообщений: 124
|
||||||||||||||||
1 | ||||||||||||||||
Pipe и все иже с ним01.12.2015, 11:16. Показов 4253. Ответов 21
Метки нет (Все метки)
Доброго вчемени суток
не так давно мной была создана тема касательно процессов https://www.cyberforum.ru/c-li... ost8403530 один и участников форума решил поставленную задачу (за что ему безграничное спасибо), НО я не став заниматься копипастом написал свой вариант решения который выглядит вот так Родительский файл
суть задачи в том чтобы переделать программу выше с помощью pipe . т е как объяснил препод избавиться от execl и решить задачу с помощью pipe таким образом дочерний файл оказался не нужным я переписал программу чтобы все работало без дочернего файла новая версия
искренне надеюсь на вашу помощь
0
|
01.12.2015, 11:16 | |
Ответы с готовыми решениями:
21
AJAX и иже с ним Combobox и иже с ним Sfinae и иже с ним OrderBy() и иже с ним |
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 |
Т.е. количество пайпов нужно открывать по количеству дочерних процессов и каждому передавать свою часть?
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 | ||||||||||
Пробуйте разобраться. На каждую функцию есть руководство (ман). Что не понятно - спрашивайте. Добавлено через 1 минуту
0
|
3 / 3 / 0
Регистрация: 22.09.2015
Сообщений: 124
|
||||||
02.12.2015, 13:12 [ТС] | 7 | |||||
gng, можно услышать какие то комментарии потому задание сделано очень лаконично и я сам себе не могу ответить как работает ваш вариант
для начала не понятно что значит каждая переменная чтобы начать разбираться (ну вру не совсем каждая но половина) Добавлено через 3 минуты не понятна вот эта строка как бы понятно что здесь описывается динамическое выделение памяти под пайп но не понятно зачем Добавлено через 1 минуту не могу понять где заканчивается родитель и начинается дочка Добавлено через 2 минуты не ясно вот это
Добавлено через 4 минуты не понятен алгоритм поиска нужного слова в считанной строке Добавлено через 12 минут что это?ни разу не сталкивался с этим Добавлено через 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 | |||||
Поскольку количество процессов заранее не известно, память под дескрипторы канала выделяется динамически.
pd - указатель на массив из двух интов. У родителя pd == p_count. У дочерних процессов - 0,1,2....p_count-1 Макрос нужен для подключения некоторых функций из заголовка, напр. getline. Если ими не пользуетесь, то и макрос не нужен. Либо компилируйте Си (не плюсы)-компилятором, напр с ключём -std=c99, либо явно приведите тип возвращаемый malloc к тому, который просят. ... = (int (*)[2])mallic(... Да, так и задумывалось. Если нужно по-другому, можно, например, разделять не по строкам, а по словам. В сороковой строке, например:
0
|
3 / 3 / 0
Регистрация: 22.09.2015
Сообщений: 124
|
|
02.12.2015, 14:01 [ТС] | 9 |
0
|
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
|
||||||
02.12.2015, 16:10 | 10 | |||||
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 |
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 | |||||
Так оно и не формируется. Проверяется наличие подстроки, а слово это или фраза, или набор символов - не важно.
Видимо, вы хотите другого:
Только имейте в виду - программа предполагает однобайтовые символы. С русскими буквами в 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, начал просто играться с пайрами и форками и вообще ничего не рабтает объясните почему??
причем и форк не понятно работает я вообще не понимаю почему так происходит он и дочерний процесс делает и ошибку выдает а пайпы вообще ничего не делают а чем ошибка? хочу разобраться а то в дальнейшем будут проблемы из за этого
0
|
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
|
|
03.12.2015, 15:13 | 16 |
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 |
Дочерний процесс (форк возвращает ноль) читает из потока 10 символов, печатает их и завершается.
Родительский процесс (форк возвращает положительное число) печатает сообщение об ошибке и завершается. В случае форсмажора (форк возвращает -1) дочерний процесс не создается, а родитель также печатает сообщение об ошибке и завершается. Добавлено через 4 минуты Напишите самый простой пример форка без циклов и пайпов и внимательно разберите.
0
|
3 / 3 / 0
Регистрация: 22.09.2015
Сообщений: 124
|
|
04.12.2015, 06:16 [ТС] | 19 |
gng, мне ну
ну так так то и оно
дочерний создается (т е форк возвращает 0) и считывает из канала иначе бы ничего не печаталось но потом еще и сообщение об ошибке печатается без циклов уже разобрал там то просто а во здесь не понимаю почему не работает хотя повторюсь в первом посте этой темы форк сделан ровно точно так же и все работает
0
|
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
|
|
04.12.2015, 13:35 | 20 |
Я вам написал, что родительский процесс сразу же завершается после форка. Как это может работать???
Может и так, но ваш код говорит об обратном.
0
|
04.12.2015, 13:35 | |
04.12.2015, 13:35 | |
Помогаю со студенческими работами здесь
20
Магнитная мешалка и иже с ним FireDAC и иже с ним. Работа с SQLite После установки сомнительной программы куча мусора в виде известного браузера и иже с ним Геймдев и всё, что с ним связанно Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |