![]() |
|
Модераторы: xvr |
![]()
|
|
| rthsobakas |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 562 Регистрация: 20.9.2007 Репутация: нет Всего: -1 |
Задача следюущая: Процесс 1 открывает фаил и порождает потомков 2 и 3 , процесс 1 с интервалом в 1 сек (через alarm) по очереди посылает N сигналов sig1 процессам 2 и 3 которые по каждому сигналу пишут в общий фаил по M чисел. Потом процесс 1 посылает потомкам сигнал sig2, процесы завершаются. Процесс 1 считывает данные из фаила и выводит на экран. Как посылается сигнал потомкам? Типо потомок так создается: int pid2; pid2=fork(); if (pid2==0){ } Зачем тут условие? и Что оно озночает(Почему именно с нулем сравнивает)? Что такое Alarm и как через него послать сигнал? И ещё скажите что означают следующие записи? 1) struct sigaction action; 2) action.sa_handler = &parent_handler; |
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
rthsobakas,
прочитайте сначала какую-нибудь литературу а лучше man 2 fork man 2 sigaction man 2 alarm man 2 kill Это сообщение отредактировал(а) MAKCim - 29.9.2008, 21:08 -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| rthsobakas |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 562 Регистрация: 20.9.2007 Репутация: нет Всего: -1 |
ну прочитал.
fork -порождает процесс Например 1 процесс породил 2 процесс. При успешном завершении родителю возвращается PID процесса-потомка, а процессу-потомку возвращается 0. Типо условие нужно для проверки создался он или нет, иначе можно без условия сделать ,но прога работать наверно работать не будет.
sigaction int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact); Системный вызов sigaction используется для изменения действий процесса при получении соответствующего сигнала. alarm это типо слипа, задержка вообщем, kill завершить процесс. kill посылает указанный сигнал указанному процессу. Если не указано ни одного сигнала, посылается сигнал TERM. Сигнал TERM завершит те процессы, которые не обрабатывают его приход. Для других процессов может быть необходимым послать сигнал 9, поскольку этот сигнал перехватить нельзя. Типо он используется для передачи сигнала потомку,тока не понятно как,,, Ну я прогу начал писать,но в фаил она не забивает символы почему то... Вернее не почему то а потому что я хз как правильно сигнал отправить.
|
||||
|
|||||
| lamao |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 73 Регистрация: 23.4.2008 Репутация: нет Всего: нет |
Вообще-то судя по постановке задачи необходимости в порождениях процессов нет. Здесь целесообразно использовать потоки как минимум по трем причинам:
1) Создание потока на порядок дешевле чем создание процесса 2) Так как первоначальный процесс контролирует выполнение дочерных процессов и имеет место межпроцесное взаимодействие. 3) Запрограммировать все это будет проще и читабельнее именно с использовнием потоков. В общем я бы в рамках одного родительского процесса создавал бы все эти сервисные потоки. Детальнее нужно читать в
|
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
Это сообщение отредактировал(а) MAKCim - 30.9.2008, 12:46 -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| rthsobakas |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 562 Регистрация: 20.9.2007 Репутация: нет Всего: -1 |
ммм... так то спасибо конечно, но хотелось бы разобраться самому( к тому же код компилится с ошибками)
Может есть специальные книги, авторы какие нибудь которые на примерах показывают? Просто рылся в яндексе,гугле там в основном статьи небольшие, причем проги простые(процесс породил потомка и убил его)... Или наоборот навароченные |
|||
|
||||
| rthsobakas |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 562 Регистрация: 20.9.2007 Репутация: нет Всего: -1 |
Вообщем я вроде понял как сигнал процессу передать
kill(pid2,SIGUSR1); kill(pid3,SIGUSR1); ими сигнал типо передается 2 и 3 потомку, а signal(SIGUSR1,catcher1); типо в потомке ловится.Тока результат разный получается почему то хз почему....(((( user@user:~/Desktop> lab4 начало... Сигнал1:1111111111 Программа закончена...Определяемый пользователем сигнал 1 user@user:~/Desktop> Сигнал1:1111111111 Сигнал2:2222222222 Сигнал3:3333333333 Программа закончена...Сигнал1:1111111111 Сигнал2:2222222222 Программа закончена... Вот это не понятно почему появляется, когда прога заработала Определяемый пользователем сигнал 1 user@user:~/Desktop> Почему 3 вызов кэтчера происходит тоже не ясно Сигнал3:3333333333 И почему повотрно прога выполняется ? Программа закончена...Сигнал1:1111111111 Сигнал2:2222222222 Программа закончена... Вообщем кто как думает в чем касяк?Я думал проблема в том что процесс потомок не завершается и выполняется рандомом ещё несколько раз и использовал типо Wait(&st) (написано в литературе что он для завершения процесса типо), но он вроде как ваще не влияет на исход результата... По логике должен получатся результат: user@user:~/Desktop> lab4 начало... Сигнал1:1111111111 Сигнал2:2222222222 Программа закончена... Потом если это в цикле сделать например 2 раза(kill(pid2,SIGUSR1);kill(pid3,SIGUSR1); ) То получится должно user@user:~/Desktop> lab4 начало... Сигнал1:1111111111 Сигнал2:2222222222 Сигнал3:3333333333 Сигнал4:4444444444 Программа закончена... Это сообщение отредактировал(а) rthsobakas - 30.9.2008, 12:39 |
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
ну вот, хороший способ разобраться сначала заставь код компилироваться, а потом задавай вопросы, что не понятно -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| rthsobakas |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 562 Регистрация: 20.9.2007 Репутация: нет Всего: -1 |
сначала заставь код компилироваться, а потом задавай вопросы, что не понятно
ну там мелкие касяки были с точкой и запятой я их убрал , с ворнингами но скомпилилось. Ну и что код все равно сложный слишком. Сложные типы, структуры какие то... Это то же самое что какой нить чувак попросил бы привести пример сложения двух чисел на паскале что то типо
а ему на встроенном асме через сопроцессор показали))) Он бы тоже офигел немного наверно))) Прочитай моё предпоследнее сообщение(это последнее), там я выразил суть проблемы. Если хочешь помочь лучше скажи что в моем(последнем) коде не так... И все |
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
rthsobakas,
у тебя мешанина с выводом в файл открывай файл в main() и делай синхронизацию при записи через flock() -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| rthsobakas |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 562 Регистрация: 20.9.2007 Репутация: нет Всего: -1 |
ммммм сделал как у тебя
в AAAAA.txt" результат ffffffffff ffffffffff ffffffffff ffffffffff То есть 4 раза он шпарит кэтчер,а надо два потому что kill(pid2,SIGUSR1); kill(pid3,SIGUSR1); тока два вызова И ещё почему то стали нужны права супер пользователя чтобы фаил посмотреть((( Добавлено через 2 минуты и 26 секунд может где то wait надо написать? такое чувство что потомки повторяются |
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
-------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| rthsobakas |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 562 Регистрация: 20.9.2007 Репутация: нет Всего: -1 |
капец , я так и знал что где то подстава
оказывается все дело в
Ещё один вопрос и я отвалю))) Fork создает процесс, а как процесс убить? Просто я читал про wait и exit они типо убивать должны. Я че то с ними экспериментировал , кроме Ворнингов компилятора они ниче не изменили... То есть смотри если я хочу убить pid2 и pid3, то опять по аналогии писать надо KILL(pid2,SIGUSR2);(в родителе) и signal(SIGUSR2,ubit); (в потомке) и писать ф-ию UBIT, а в ней exit(0);? и в родителе вместо return 0 писать exit(0)? так получается? |
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
в родителе wait() в дочернем процессе _exit() -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| rthsobakas |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 562 Регистрация: 20.9.2007 Репутация: нет Всего: -1 |
Вообщем вот конечный вариант
Вообщем все вроде хорошо, только не знаю почему ,но в конце при чтении фаила и вывода на экран каждого символа последняя строка(фаила) не читается. Причем если сделать другую прогу и там попробывать этот фаил прочитать, то все прочтется нормально...Пробывал for`ом каждый символ выводить , после 5 строки нули выводит, хз почему... |
|||
|
||||
![]()
|
| Правила форума "С/С++: Программирование под Unix/Linux" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |