Модераторы: powerfox, ZeeLax
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сигналы в линукс 
:(
    Опции темы
IBS
Дата 29.5.2012, 00:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 214
Регистрация: 29.7.2008
Где: Белоруссия

Репутация: нет
Всего: 6



Не могу разобраться....
Пример кода:
Код

void handler(int i)
{
    printf("\nHandler\n");
}

int main()
{
    int id;
    if ((id = fork()) < 0)
    {
        perror("\nCan't fork child");
        exit(1);
    }
    else if(id > 0){
        //Родительский процесс
        printf("Parent1\n");
        kill(id, SIGUSR1);
        printf("Parent2\n");
    }
    else{
        //Дочерний процесс
        signal(SIGUSR1, handler);
        printf("Child\n");
    }
    return 0;
}

Итог:
Код

parent1
parent2

Желаемый результат:
Код

parent1
Child
parent2


Подскажите как правильно подобное реализовать??

Это сообщение отредактировал(а) IBS - 29.5.2012, 00:07
PM MAIL   Вверх
bilbobagginz
Дата 29.5.2012, 06:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

Репутация: 113
Всего: 317



Заметь: твои процессы слишком коротко живут.

"упражнение" по сигналам:
в общем, каждый раз когда сынок изменяет статус (бегу, сплю, отдыхаю, умираю), родитель получает сигнал 17 (SIGCHLD). в частности, когда сыновний процесс издыхает, он тоже выпускает на последнем дыхании этот SIGCHLD. 
Вот попробуй отловить его дополнительным обработчиком.

Моя теория:
Ты послыаешь сигнал SIGUSR1 сыну, когда тот уже издох. Поэтому, обработчик ничего не печатает.
но предварительно, по правилам кашрута сын посылает сигнал папаше SIGCHLD.
A папаша его не слушает (извечная проблема: отцы и дети smile )


Eще момент: 
ты (скрытое предположение) ожидаешь от сына, будто он ни хрена не делает и только ждет когда его папаня чего нибудь попросит сделать. т.е. игнорируешь возможность того, что сын реально занят (или уже умер smile )

i.e.:
сухо - проблема параллелизма
с соусом - в России многие родители считают, что сам факт их родительства дает им полное право нарушать график работы детей без заззрения совести smile 

я могу представить ситуацию, когда твой обработчик сигнала распечатает строку после строк родителя, т.е.:
Код

parent1
parent2
Child


Это сообщение отредактировал(а) bilbobagginz - 29.5.2012, 06:36


--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
baldina
Дата 29.5.2012, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: нет
Всего: 101



IBS, читай про wait(), waitpid()
http://mij.oltrelinux.com/devel/unixprg/#tasks
PM MAIL   Вверх
IBS
Дата 29.5.2012, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 214
Регистрация: 29.7.2008
Где: Белоруссия

Репутация: нет
Всего: 6



Спасибо, в чем косяк понял:
Я пытаюсь отправить сигнал процессу, который еще не был создан....

Должно быть как-то так
Код


void handler(int i)
{
}

int main()
{
    int id;
    if ((id = fork()) < 0)
    {
        perror("\nCan't fork child");
        exit(1);
    }
    else if(id > 0){
        //Родительский процесс
        printf("Parent1\n");
        sleep(1);
        kill(id, SIGUSR1); //шлем сигнал
        
        signal(SIGUSR1, handler);
        pause(); //Подождем пока ребенок все сделает и отчитается

        printf("Parent2\n");
    }
    else{
        //Дочерний процесс
        signal(SIGUSR1, handler);
        pause(); //Блокируем процесс пока не поступил сигнал
        printf("Child\n");

        kill(id, SIGUSR1);//Сделал - отчитался
    }
    return 0;
}


Но здесь мне не нравится следующая ситуация: я чтобы дождаться пока дочерний процесс будет создан ставлю sleep - как -то это не правильно. Пробовал приоритеты расставлять процессам в родительском через setpriority - не помогает. Пробовал kill(id, SIGUSR1) засунуть в While и пытаться дождаться пока сигнал не будет отослан успешно - так он родительский процесс крутит до посинения, а дочернего все нет(

ps: bilbobagginz, ответил таки прикольно smile   smile 

Цитата

IBS, читай про wait(), waitpid()

Не совсем то. wait - блокирует процесс до тех пор пока дочерний процесс не завершится, а мне надо чтобы он блокировался до тех пор пока не будет создан дочерний. 
Хотя... конечно можно было вообще отправку/принятие сигналов заменить на wait в конкретном случае, но по условию надо через сигналы

Это сообщение отредактировал(а) IBS - 29.5.2012, 15:26
PM MAIL   Вверх
baldina
Дата 29.5.2012, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: нет
Всего: 101



не так. дочерний процесс уже создан, но не установлен обработчик
так:

Код

    signal(SIGUSR1, handler);

    int id;
    if ((id = fork()) < 0)
    {
        perror("\nCan't fork child");
        exit(1);
    }
    else if(id > 0){
        //Родительский процесс
        printf("Parent1\n");
        kill(id, SIGUSR1); //шлем сигнал
        pause();
        printf("Parent2\n");
    }
    else{
        //Дочерний процесс
        pause ();
        printf("Child\n");
        kill(getppid (), SIGUSR1);//Сделал - отчитался
    }



Добавлено через 1 минуту и 13 секунд
кстати, кому тут шлется сигнал?
Цитата(IBS @  29.5.2012,  10:49 Найти цитируемый пост)
kill(id, SIGUSR1);//Сделал - отчитался


Это сообщение отредактировал(а) baldina - 29.5.2012, 11:52
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Linux/UNIX: Oбщие вопросы"
nickless
Imple
nerezus

В тему здесь вопросы общие - не привязанные к определенному ПО или дистрибутиву BSD/Linux/UNIX.
Например вопросы о выборе ОС для определенных задач (но если Вы просто хотите узнать "Какой дистрибутив лучше", то для этого есть Клуб юнуксоидов).
Общие вопросы по shell-программированию тоже лучше задавать здесь.


  • Вопросы мобильной разработки тут
  • Вы должны соблюдать правила форума.
  • Помните: какой вопрос, такой и ответ. Прежде чем задать вопрос прочитайте вот эту статью на форуме CIT.
  • Оскорблять запрещается.
  • Религиозные войны в Религиозных войнах.
  • Общение "просто так" в Клубе юнуксоидов. В отличие от многих других разделов, здесь разрешается сдержанно оффтопить и юморить в тему.

За интересные статьи, находки, решения, программы и просто реальную помощь будут ставиться + в репу).


В данный момент этот раздел модерируют nerezus, nickless, powerfox, pythonwin, Imple и ZeeLax. Если вы хотите помочь нам, пишите в ПМ и мы обсудим.


Спасибо. И use UNIX or die; С уважением, nerezus, nickless, powerfox, pythonwin, Imple, ZeeLax.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | *NIX системы: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0504 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.