Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ под Linux

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

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

13.12.2016, 22:42. Просмотров 427. Ответов 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 раз, но этого не происходит, подскажите плз куда копать? благодарствую
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.12.2016, 22:42
Я подобрал для вас темы с готовыми решениями и ответами на вопрос И снова процессы и сигналы (C++ Linux):

ПРОЦЕССЫ И СИГНАЛЫ ОС UNIX - C++ Linux
Здравствуйте,очень нужна Ваша помощь в создании программы на C++. Владея, исключительно, только теоритическими навыками в данной области,...

сигналы - C++ Linux
Создается два процесса, которые обмениваются сигналами, по прошествии нескольких циклов обмена родительский процесс завершается и дочерний...

Программа не обрабатывает сигналы - C++ Linux
Привет. Пишу программу. Она немного более широкая, чем просто прием разных сигналов) но там более менее понятно все. Я же не могу...

Используя сигналы, обеспечить нужное содержание файла - C++ Linux
процесс 1 порождает потомка 2.Процес 1 пишет в общий файл число 1, процесс 2-число2. Используя сигналы, обеспечить следующий содержание...

Синхронизация через сигналы UNIX. Как обрабатывать SIGCHLD в родительском процессе ? - C++ Linux
Уважаемые программисты возник вопрос как сообщить родительскому сигналу о завершении дочернего процесса ? Создал три зомби-процесса....

И снова логирование - C++
Есть желание сделать в своём приложении нормальную систему логирования. Должно быть несколько уровней логирования и несколько категорий...

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

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

Добавлено через 4 часа 6 минут
вопрос снят, синхронизировал пайпами
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.12.2016, 17:47
Привет! Вот еще темы с ответами:

Процессы - C++ Linux
Здравствуйте, нужна ваша помощь, дело в том что я пишу простую программку с процессами, а в качестве компилятора использую g++. #include...

процессы - C++ Linux
Необходимо реализовать функцию запуска и параллельного выполнения нескольких программ. Задаётся количество выполняемых программ и набор их...

Процессы и каналы - C++ Linux
Привет. Есть задание Всё понятно, кроме того, что выделено жирным, примерно понимание есть, но как реализовать как - не понимаю. ...

Процессы и Демоны - C++ Linux
Добрый день нужно написать 2 лабы но я и с линксом плохо знаком не то что с программированием для него , прошу помочь ссылкой на инфу в ...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

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