Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
191 / 151 / 61
Регистрация: 08.04.2010
Сообщений: 1,032

сигналы

01.05.2016, 11:15. Показов 2103. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Создается два процесса, которые обмениваются сигналами, по прошествии нескольких циклов обмена родительский процесс завершается и дочерний создает еще один процесс. После чего обработка сигналов перестает работать. В чем может быть дело?
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
int main(){
    currentProcess=0;
 
    signal(SIGUSR1, signalProcess);
    signal(SIGUSR2, signalEndP);
 
    return nextiterationprocess(fork());
}
 
int nextiterationprocess(pid_t pidCn){
    iteration=0;
    ++currentProcess;
 
    if(pidCn<0){         //ошибка
        printf("Ошибка: не удалось создать процесс\n");
        return -1;
    }
    if(pidCn>0){ //процесс-родитель
        pidC=pidCn;
        printf("Процесс-родитель %d", getpid());
        
        sleep(1);
        while(iteration<countiteration){
            kill(pidCn, SIGUSR1);
            sleep(1);
        }
 
        int status;
        if(wait(&status)==-1)
            printf("ошибка ожидания");
    }
    else{ //процесс-потомок
        pidC=getpid();
        printf("Процесс-потомок %d его родитель %d", getpid(), getppid());
 
        while(true){
        }
    }
 
    return 0;
}
 
void signalProcess(int sig){
    switch(sig){
        case SIGUSR1:
            if(getpid()==pidC){ //потомок
                if(iteration>countiteration){
                    printf("Процесс %d завершен", currentProcess);
                    kill(getppid(), SIGUSR2);
 
                    if(currentProcess<countprocess){
                        sleep(1);
                        nextiterationprocess(fork());
                    }
                    else
                        exit(0);
                }
                else{
                    ++iteration;
                    printf("Процесс-потомок %d получил сигнал от родителя", getpid());
                    kill(getppid(), SIGUSR1);
                }
            }
            else{   //родитель
                sprintf("Процесс-родитель %d получил сигнал от потомка", getpid());
            }
            break;
 
        default:
            printf("Пришел неизвестный сигнал %d", sig);
            break;
    }
}
 
void signalEndP(int signum){
    if(signum==SIGUSR2){
        printf("Процесс завершен");
        iteration=countiteration+1;
    }
}
Добавлено через 7 минут
Процесс может посылать сигналы только членам своей группы процессов (process group). После завершения первого родителя потомок получает pid родителя 1, я думаю что изменяется группа процесса как посмотреть группу процесса?

Добавлено через 1 час 38 минут
Разобрался, нельзя вызывать из обработчика сигнал второй которой завершит поток.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.05.2016, 11:15
Ответы с готовыми решениями:

И снова процессы и сигналы
доброго дня всем, снова набивший всем оскомину вопрос о процессах и сигналах. есть такой код #include &lt;sys/wait.h&gt; #include...

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

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

1
4 / 4 / 1
Регистрация: 04.04.2016
Сообщений: 23
14.05.2016, 02:34
kill может послать сигнал любому процесу. Еще бы показал инициализацию глобальных переменных, а то не понятно чему равно countiteration на старте.

Добавлено через 40 минут
Первый родитель на сколько я понимаю не завершился, а находиться в ожидании окончания работы потомка if(wait(&status)==-1)

Добавлено через 19 минут
И наверное проблема в том что форк делаешь с обработчика сигналов. Как по мне это не правильно. В обработчике лучше изменить флаг (например must_fork = 1),а в вечном цикле сделать сам форк.

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
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/acl.h>
#include <errno.h>
#include <fcntl.h>
#include <dirent.h>
#include <cstdio>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <sys/wait.h>
 
#include <time.h>
#include <unistd.h>
 
int currentProcess;
int countprocess=3;
int iteration;
int pidC;
int countiteration=2;
int mustfork = 0;
 
void signalProcess(int sig);
void signalEndP(int signum);
int nextiterationprocess(pid_t pidCn);
 
int main(){
    currentProcess=0;
    printf("start programm \n");
    signal(SIGUSR1, signalProcess);
    signal(SIGUSR2, signalEndP);
 
    return nextiterationprocess(fork());
}
 
int nextiterationprocess(pid_t pidCn){
    iteration=0;
    ++currentProcess;
    
 
    if(pidCn<0){         //ошибка
        printf("Ошибка: не удалось создать процесс\n");
        return -1;
    }
    if(pidCn>0){ //процесс-родитель
        pidC=pidCn;
        printf("Процесс-родитель %d\n", getpid());
        
        sleep(1);
        while(iteration<countiteration){
            printf("pidC=%d get pid=%d\n",pidCn,getpid());
            if (kill(pidCn, SIGUSR1) < 0)
                printf("error %s\n",strerror(errno));
            sleep(1);
        }
 
        int status;
        if(wait(&status)==-1)
            printf("ошибка ожидания\n");
    }
    else{ //процесс-потомок
 
        pidC=getpid();
        printf("Процесс-потомок %d его родитель %d\n", getpid(), getppid());
 
        while(true){
            if (mustfork == 1){
                mustfork = 0;
                nextiterationprocess(fork());
            }
        }
    }
 
    return 0;
}
 
void signalProcess(int sig){
    switch(sig){
        case SIGUSR1:
            if(getpid()==pidC){ //потомок
                if(iteration>countiteration){
                    printf("Процесс %d завершен\n", currentProcess);
                    kill(getppid(), SIGUSR2);
 
                    if(currentProcess<countprocess){
                        sleep(1);
                        mustfork = 1;
                        
                    }
                    else
                        exit(0);
                }
                else{
                    ++iteration;
                    printf("Процесс-потомок %d получил сигнал от родителя\n", getpid());
                    kill(getppid(), SIGUSR1);
                }
            }
            else{   //родитель
                printf("Процесс-родитель %d получил сигнал от потомка\n", getpid());
            }
            break;
 
        default:
            printf("Пришел неизвестный сигнал %d\n", sig);
            break;
    }
}
 
void signalEndP(int signum){
    if(signum==SIGUSR2){
        printf("Процесс завершен\n");
        iteration=countiteration+1;
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.05.2016, 02:34
Помогаю со студенческими работами здесь

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

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

Что значат эти сигналы (vmware w, bios сигналы)?
Создаю машину с Kali, при запуске если стоит bios 1 длинный сигнал , если uefi 1 длинный и 1 короткий сигнал, XP ставится нормально, в чем...

Сигналы
Здравствуйте!! Помогите пожалуйста с заданием!!! Нужно написать программу. В которой: 1)Процесс-отец пораждает 4 дочерних процесса,...

Сигналы
Необходимо решить 1-4 задачи


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru