Форум программистов, компьютерный форум CyberForum.ru

С++ под Linux

Войти
Регистрация
Восстановить пароль
 
voleg31
0 / 0 / 0
Регистрация: 04.12.2015
Сообщений: 9
#1

И снова процессы и сигналы - C++ Linux

13.12.2016, 22:42. Просмотров 377. Ответов 2
Метки нет (Все метки)

доброго дня всем, снова набивший всем оскомину вопрос о процессах и сигналах. есть такой код
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
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <iostream>
 
static void signal_handler(int signo) {
    if (signo == SIGUSR1) {
        std::cout << getpid() << ": принят SIGUSR1" << std::endl;
    } else if (signo == SIGUSR2) {
        std::cout<<getpid()<<": принят SIGUSR2"<<std::endl;
    } else if (signo == SIGCHLD) {
        std::cout<<getpid()<<": принят SIGCHLD"<<std::endl;
        exit(0);
    } else if (signo == SIGTERM) {
        std::cout<<getpid()<<": принят SIGTERM"<<std::endl;
        exit(0);
    } else {
        std::cout<<getpid()<<": принят сигнал "<<signo<<std::endl;
    }
}
 
void send_signals(int pid, int sig) {
    std::cout<<"from:"<<getpid()<<" to:"<<pid<<" sig:"<<sig<<std::endl;
    for (int i = 0; i < 10; i++)
        kill(pid, sig);
}
 
void setup_signals_handler() {
    if (signal(SIGUSR1, signal_handler) == SIG_ERR) {
        std::cout<<"невозможно перехватить сигнал SIGUSR1"<<std::endl;
        exit(1);
    }
    if (signal(SIGUSR2, signal_handler) == SIG_ERR) {
        std::cout<<"невозможно перехватить сигнал SIGUSR2"<<std::endl;
        exit(1);
    }
    if (signal(SIGTERM, signal_handler) == SIG_ERR) {
        std::cout<<"невозможно перехватить сигнал SIGTERM"<<std::endl;
        exit(1);
    }
    if (signal(SIGCHLD, signal_handler) == SIG_ERR) {
        std::cout<<"невозможно перехватить сигнал SIGCHLD"<<std::endl;
        exit(1);
    }
}
 
int main() {
    setup_signals_handler();
 
    pid_t pid = 0;
    if ((pid = fork()) < 0) {
        std::cout<<"ошибка вызова fork"<<std::endl;
        exit(1);
    }
 
    if (pid > 0) {
        std::cout<<"parent:"<<getpid()<<std::endl;
        send_signals(pid, SIGUSR2);
    } else {
        std::cout<<"child:"<<getpid()<<std::endl;
        send_signals(getppid(), SIGUSR1);
    }
 
    while (1)
        pause();
 
    return 0;
}
выдает такой резалт:

parent:4820
from:4820 to:4821 sig:12
4821: принят SIGUSR2
child:4821
from:4821 to:4820 sig:10
4820: принят SIGUSR1
4820: принят SIGUSR1
4820: принят SIGUSR1
4820: принят SIGUSR1
4820: принят SIGUSR1
4820: принят SIGUSR1
4820: принят SIGUSR1
4820: принят SIGUSR1
4820: принят SIGUSR1
4820: принят SIGUSR1

ожидается что хэндлер SIGUSR2 тоже должен отработать 10 раз, но этого не происходит, подскажите плз куда копать? благодарствую
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.12.2016, 22:42     И снова процессы и сигналы
Посмотрите здесь:
ПРОЦЕССЫ И СИГНАЛЫ ОС UNIX C++ Linux
C++ Linux сигналы
Программа не обрабатывает сигналы C++ Linux
C++ Linux Используя сигналы, обеспечить нужное содержание файла
Синхронизация через сигналы UNIX. Как обрабатывать SIGCHLD в родительском процессе ? C++ Linux
C++ Linux Процессы
C++ Linux процессы
Процессы и Демоны C++ Linux
Процессы и каналы C++ Linux
Процессы под unix C++ Linux
Процессы и файлы в Linux C++ Linux
C++ Linux Сортировка деревом. Процессы

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
socslm
16 / 16 / 3
Регистрация: 10.05.2015
Сообщений: 57
13.12.2016, 23:38     И снова процессы и сигналы #2
Одинаковые сигналы могут сливаться несколько -> в один.
Смотреть наверное лучше в сторону задержек или подтверждений (обмен сигналами по очереди)
voleg31
0 / 0 / 0
Регистрация: 04.12.2015
Сообщений: 9
14.12.2016, 17:47  [ТС]     И снова процессы и сигналы #3
спасибо

Одинаковые сигналы могут сливаться несколько -> в один.
где бы с этим можно ознакомиться?
обмен сигналами по очереди
это первое что приходит в голову, но учитывая асинхронную природу обработчика..

Добавлено через 4 часа 6 минут
вопрос снят, синхронизировал пайпами
Yandex
Объявления
14.12.2016, 17:47     И снова процессы и сигналы
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru