| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Программирование под Unix/Linux > процесс, потомки, сигналы |
| Автор: rthsobakas 29.9.2008, 17:11 |
Задача следюущая: Процесс 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 29.9.2008, 21:06 |
| rthsobakas, прочитайте сначала какую-нибудь литературу а лучше man 2 fork man 2 sigaction man 2 alarm man 2 kill |
| Автор: rthsobakas 29.9.2008, 21:53 | ||||
| ну прочитал. 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 29.9.2008, 22:18 | ||
| Вообще-то судя по постановке задачи необходимости в порождениях процессов нет. Здесь целесообразно использовать потоки как минимум по трем причинам: 1) Создание потока на порядок дешевле чем создание процесса 2) Так как первоначальный процесс контролирует выполнение дочерных процессов и имеет место межпроцесное взаимодействие. 3) Запрограммировать все это будет проще и читабельнее именно с использовнием потоков. В общем я бы в рамках одного родительского процесса создавал бы все эти сервисные потоки. Детальнее нужно читать в
|
| Автор: MAKCim 30.9.2008, 00:12 | ||
|
| Автор: rthsobakas 30.9.2008, 09:21 |
| ммм... так то спасибо конечно, но хотелось бы разобраться самому( к тому же код компилится с ошибками) Может есть специальные книги, авторы какие нибудь которые на примерах показывают? Просто рылся в яндексе,гугле там в основном статьи небольшие, причем проги простые(процесс породил потомка и убил его)... Или наоборот навароченные |
| Автор: rthsobakas 30.9.2008, 12:32 | ||
Вообщем я вроде понял как сигнал процессу передать
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, 13:02 | ||
| сначала заставь код компилироваться, а потом задавай вопросы, что не понятно ну там мелкие касяки были с точкой и запятой я их убрал , с ворнингами но скомпилилось. Ну и что код все равно сложный слишком. Сложные типы, структуры какие то... Это то же самое что какой нить чувак попросил бы привести пример сложения двух чисел на паскале что то типо
а ему на встроенном асме через сопроцессор показали))) Он бы тоже офигел немного наверно))) Прочитай моё предпоследнее сообщение(это последнее), там я выразил суть проблемы. Если хочешь помочь лучше скажи что в моем(последнем) коде не так... И все |
| Автор: MAKCim 30.9.2008, 13:07 |
| rthsobakas, у тебя мешанина с выводом в файл открывай файл в main() и делай синхронизацию при записи через flock() |
| Автор: rthsobakas 30.9.2008, 13:45 | ||
ммммм сделал как у тебя
в AAAAA.txt" результат ffffffffff ffffffffff ffffffffff ffffffffff То есть 4 раза он шпарит кэтчер,а надо два потому что kill(pid2,SIGUSR1); kill(pid3,SIGUSR1); тока два вызова И ещё почему то стали нужны права супер пользователя чтобы фаил посмотреть((( Добавлено через 2 минуты и 26 секунд может где то wait надо написать? такое чувство что потомки повторяются |
| Автор: MAKCim 30.9.2008, 14:46 | ||
|
| Автор: rthsobakas 30.9.2008, 15:03 | ||
| капец , я так и знал что где то подстава оказывается все дело в
Ещё один вопрос и я отвалю))) Fork создает процесс, а как процесс убить? Просто я читал про wait и exit они типо убивать должны. Я че то с ними экспериментировал , кроме Ворнингов компилятора они ниче не изменили... То есть смотри если я хочу убить pid2 и pid3, то опять по аналогии писать надо KILL(pid2,SIGUSR2);(в родителе) и signal(SIGUSR2,ubit); (в потомке) и писать ф-ию UBIT, а в ней exit(0);? и в родителе вместо return 0 писать exit(0)? так получается? |
| Автор: MAKCim 30.9.2008, 15:29 |
в родителе wait() в дочернем процессе _exit() |
| Автор: rthsobakas 5.10.2008, 14:32 | ||
Вообщем вот конечный вариант
Вообщем все вроде хорошо, только не знаю почему ,но в конце при чтении фаила и вывода на экран каждого символа последняя строка(фаила) не читается. Причем если сделать другую прогу и там попробывать этот фаил прочитать, то все прочтется нормально...Пробывал for`ом каждый символ выводить , после 5 строки нули выводит, хз почему... |
| Автор: MAKCim 6.10.2008, 08:27 |
| rthsobakas, у меня работает да, в catcher2 нужен _exit(), а не wait() |