Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
4 / 4 / 2
Регистрация: 13.11.2012
Сообщений: 253

Учет функционирующих процессов приложения с применением сигналов

05.02.2016, 17:18. Показов 805. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток.
При порождении дочерних процессов, каждый процесс должен отправлять самому первому процессу сигнал SIGUSR1, а при своем завершении сигнал SIGUSR2, таким образом первый процесс должен вести учет функционирующих в данный момент процессов. Как это лучше и правильнее организовать? завести глобальную переменную, обработчик сигнала, при получении процессом сигнала SIGUSR1, будет увеличивать ее на 1, а при получении сигнала SIGUSR2 будет ее уменьшать на 1. Или как-то по-другому лучше это реализовать?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.02.2016, 17:18
Ответы с готовыми решениями:

Разработка приложения для предметной области "Учет товаров на оптовой базе" с применением языка Delphi
Вообщем вот такое задание... Тема7. Разработка приложения для предметной области "Учет товаров на оптовой базе" с применением...

Многопоточная сортировка Шелла с применением процессов
Собственно,что я вообще делаю : сначала разделяю исходный массив на 4 подмассива,далее в главном процессе создаю дочерний(файловые...

Разработать интерфейс приложения с применением компонентов
Разработать интерфейс приложения с применением компонентов: Edit, StringGrid, BitBtn, Button, Label Задание. Даны две квадратные матрицы...

6
 Аватар для Olej
322 / 170 / 24
Регистрация: 25.03.2012
Сообщений: 712
05.02.2016, 19:46
Цитата Сообщение от konsul777 Посмотреть сообщение
Или как-то по-другому лучше это реализовать?
До порождения каких-либо новых процессов, родитель должен заполнить переменную:
C
1
pid_t pid = gtpid();
+ установить обработчик (sigmask) для 2-х ваших сигналов.

pid - будет target для отсылки сигналов (копия этого значения будет у каждого дочернего), а сигналы будете обрабатывать как написали.

P.S. Можете и более детальную информацию отправлять с сигналом, если сделаете обработку сигналов по схеме реального времени.
1
4 / 4 / 2
Регистрация: 13.11.2012
Сообщений: 253
06.02.2016, 11:48  [ТС]
Olej, попытался написать сначала с одним сигналом посмотреть, но что-то не то, не работает.
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
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/wait.h>
 
int countproc = 0;
void *sigmyhand(int sig)
{
    countproc=countproc+1;
    printf ("Glavnyj process poluchaet signal ot potomka:\n");
    printf ("kolichestvo rabochih processov %d\n ",countproc);
    return;
}
 
int main()
{
pid_t pid,p1,p2,p3;
pid = getpid();
struct sigaction act;
act.sa_handler = sigmyhand(SIGUSR1);
sigset_t set;
sigemptyset(&set);
sigaddset(&set,SIGUSR1);
act.sa_mask = set;
sigaction(SIGUSR1,&act,0);
p1=fork();
if (p1==0)
    {
    printf("process PID=%d, posylaet signal SIGUR1 processu PID= %d\n ",(int)getpid(),(int)pid);
    kill(pid, SIGUSR1);
    }
else if (p1>0)
    {
    p2=fork();
    if (p2==0)
        {
        printf("process PID=%d, posylaet signal SIGUR1 processu PID= %d\n ",(int)getpid(),(int)pid);
        kill(pid,SIGUSR1);
        }
        else if (p2>0)
        {
        wait(NULL);
        }
    }
 
return (0);
}
В чем ошибки?
0
4 / 4 / 2
Регистрация: 13.11.2012
Сообщений: 253
07.02.2016, 13:42  [ТС]
удалось сделать таким образом
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
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/wait.h>
 
static int countproc = 1,flag=0;
pid_t p1;
sigset_t mask,newmask,oldmask;
void sigmyhand(int sig)
{
    if (sig == SIGUSR1)
    {
        countproc=countproc+1;flag++;
        printf ("Glavnyj process poluchaet signal SIGUSR1 ot potomka:\n");
        printf ("kolichestvo rabochih processov %d\n ",countproc);
    }
    if (sig == SIGUSR2)
    {
        countproc=countproc-1;flag++;
        printf ("Glavnyj process poluchaet signal SIGUSR2 ot potomka:\n");
        printf ("kolichestvo rabochih processov %d\n ",countproc);
    }
}
pid_t proc3()
{
    pid_t pd=fork();
    if (pd)
        return (pd);
    
    printf("Process 3 slet signal SIGUSR1 pervomu\n");
    kill(p1,SIGUSR1);
    printf("Process 3 slet SIGUSR2 i zavershaetsa\n");
    kill(p1,SIGUSR2);
    exit(0);
}
pid_t proc2()
{
    pid_t p;
    p=fork();
    if (p)
        return (p);
    proc3();
    printf("Process 2 shlet signal SIGUSR1 pervomu\n");
    kill(p1,SIGUSR1);
    printf("Process 2 slet SIGUSR2 i zavershaetsa\n");
    kill(p1,SIGUSR2);
    exit(0);
}
int main()
{
    sigemptyset(&mask);
    sigemptyset(&newmask);
    sigaddset(&newmask,SIGUSR1);
    sigaddset(&newmask,SIGUSR2);
    sigprocmask(SIG_BLOCK,&newmask,&mask);
    signal(SIGUSR1,sigmyhand);
    signal(SIGUSR2,sigmyhand);
    proc2();
    while(flag!=4)
        sigsuspend(&mask);
    printf("parrent process is exist\n");
    wait(NULL);
    exit(0);
 
return (0);
}
результат работы
Process 2 shlet signal SIGUSR1 pervomu
Glavnyj process poluchaet signal SIGUSR1 ot potomka:
kolichestvo rabochih processov 2
Process 2 slet SIGUSR2 i zavershaetsa
Glavnyj process poluchaet signal SIGUSR2 ot potomka:
kolichestvo rabochih processov 1
Process 3 slet signal SIGUSR1 pervomu
Glavnyj process poluchaet signal SIGUSR1 ot potomka:
kolichestvo rabochih processov 2
Process 3 slet SIGUSR2 i zavershaetsa
Glavnyj process poluchaet signal SIGUSR2 ot potomka:
kolichestvo rabochih processov 1
parrent process is exist
0
4 / 4 / 2
Регистрация: 13.11.2012
Сообщений: 253
02.03.2016, 01:47  [ТС]
Можно ли каким-то образом запустить отдельный поток в главном родительском процессе, который бы исключительно перехватывал от потомков сигналы? И как это лучше сделать?
0
 Аватар для Olej
322 / 170 / 24
Регистрация: 25.03.2012
Сообщений: 712
02.03.2016, 20:34
Можно ли каким-то образом запустить отдельный поток в главном родительском процессе, который бы исключительно перехватывал от потомков сигналы? И как это лучше сделать?
konsul777 вне форума Сообщить модератору о нарушении Сказать спасибо за это сообщение (+1 балл репутации) Быстрый
Можно.
Но сигналы не направляются отдельным потокам, только процессу в целом.
Нужно этому потоку сигнальной маской разрешить реакцию на этот сигнал, а всем остальным запретить.
1
4 / 4 / 2
Регистрация: 13.11.2012
Сообщений: 253
03.03.2016, 19:19  [ТС]
набросал такой код
Кликните здесь для просмотра всего текста
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
#include <stdio.h>
 
#include <unistd.h>
 
#include <sys/types.h>
 
#include <stdlib.h>
 
#include <signal.h>
 
#include <sys/wait.h>
 
#include <pthread.h>
 
 
 
static int countproc = 1,flag=0;
 
pid_t p1;
 
sigset_t mask,newmask,oldmask,pmask;
 
 
 
void sigmyhand(int sig)
 
{
 
    if (sig == SIGUSR1)
 
    {
 
        countproc=countproc+1;flag++;
 
        printf ("Glavnyj process poluchaet signal SIGUSR1 ot potomka:\n");
 
        printf("FLAG=%d\t\n",flag);
 
        printf ("kolichestvo rabochih processov %d\n ",countproc);
 
    }
 
    if (sig == SIGUSR2)
 
    {
 
        countproc=countproc-1;flag++;
 
        printf ("Glavnyj process poluchaet signal SIGUSR2 ot potomka:\n");
 
        printf("FLAG=%d\t\n",flag);
 
        printf ("kolichestvo rabochih processov %d\n ",countproc);
 
    }
 
}
 
struct sigaction act;
 
pid_t proc3()
 
{
 
    pid_t pd=fork();
 
    if (pd)
 
        return (pd);
 
    
 
    printf("Process 3 slet signal SIGUSR1 pervomu\n");
 
    kill(p1,SIGUSR1);
 
    printf("Process 3 slet SIGUSR2 i zavershaetsa\n");
 
    kill(p1,SIGUSR2);
 
    exit(0);
 
}
 
pid_t proc2()
 
{
 
    pid_t p;
 
    p=fork();
 
    if (p)
 
        return (p);
 
    proc3();sleep(2);
 
    printf("Process 2 shlet signal SIGUSR1 pervomu\n");
 
    kill(p1,SIGUSR1);
 
    printf("Process 2 slet SIGUSR2 i zavershaetsa\n");
 
    kill(p1,SIGUSR2);
 
    exit(0);
 
}
 
int main()
 
{
 
    sigemptyset(&oldmask);
 
    sigemptyset(&newmask);
 
    sigaddset(&newmask,SIGUSR1);
 
    sigaddset(&newmask,SIGUSR2);
 
    pthread_sigmask(SIG_BLOCK,&newmask,&oldmask);
 
    
 
    p1=getpid();
 
    pthread_t potok;
 
    void *startpotok(void*);
 
    pthread_create(&potok,NULL,startpotok,NULL);
 
    proc2();
 
    
 
    sleep(5);
 
    printf("parrent process is exist\n");
 
 
 
    
 
    exit(0);
 
 
 
return (0);
 
}
 
void *startpotok(void *arg)
 
{
 
    int k;
 
 
 
    while(flag!=4)
 
        {
 
        sigwait(&newmask,&k);
 
        if (k==SIGUSR1)
 
        printf("принят сигнал 1\n");
 
        if (k==SIGUSR2)
 
        printf("принят сигнал 2\n");
 
        }
 
    pthread_exit((void*)0);
 
}

вроде бы работает, но как "запараллелить" два потока, то есть чтобы они завершались одновременно? Если убрать sleep в main'e после функции proc2, программа работает некорректно, подозреваю, что дело как раз в том, что первый поток, который main завершается раньше запущенного.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.03.2016, 19:19
Помогаю со студенческими работами здесь

Какова вероятность взлома web приложения, написанного на .NET Core c применением Identity?
Делаю свой проект с применением identity и соблюдаю все рекомендации по безопасности, рекомендуемые Microsoft.Каков шанс взлома такого...

Создание клиент-серверного приложения с применением межпроцессного взаимодействия на основе проекций файлов
Написать с применением межпроцессного взаимодействия на основе проекций файлов два консольных приложения: серверное и клиентское. ...

форум-система функционирующих знаний
вообще не знаю, почему админ удалил старую тему. мб потому, что там упоминалась политика. ну и что тут такого? кодинг напрямую связан с...

создание форума-системы функционирующих знаний
Здравствуйте. у меня вопрос не большой на самом деле. для достижения описаного в заголовке темы нужно немного: работающие из сообщений...

Переменная, отображающая количество объектов, функционирующих в программе
Может быть кто знает, как это сделать... задача такая: нужно в классе создать аргумент, который бы отображал, кол-во объектов...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru