Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.68/25: Рейтинг темы: голосов - 25, средняя оценка - 4.68
 Аватар для Высокий
250 / 250 / 135
Регистрация: 09.04.2011
Сообщений: 524

Сигналы (sigwait)

15.12.2012, 21:00. Показов 5040. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Есть прога, где процесс-потомок и предок обмениваются сигналами. Как все должно быть - предок посылает сигнал, и потом засыпает на sigwait-е до ответного сигнала от потомка. Потомок ждет сигнала на sigwait-е, и получив сигнал - отправляет ответный предку. Сделал, но почему то прога полностью зависает на sigwait-е =\
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
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
 
char byte = '0';
//Функция, обработчик сигналов USR1 и USR2
void ReadWrite(int sig) 
{
    switch(sig)
    {
        case SIGUSR1: //USR1 = прочитать один байт из файла
        {
            FILE *file = fopen("lab4text", "r");
            printf("%d", fgetc(file));
            fclose(file);
        } break;
        case SIGUSR2: //USR2 = записать байт в файл (с перезаписью всего файла)
        {
            FILE *file = fopen("lab4text", "w");
            fprintf(file, "%d", byte);
            fclose(file);
        } break;
    }
}
 
 
int main(void)
{
    int i, child, parent, sig;
    struct sigaction act;
    memset(&act, 0, sizeof(act));
    /*Устанавливаем функцию ReadWrite как обработчик набора сигналов
      act*/
    act.sa_handler = ReadWrite; 
    sigset_t set; 
    sigemptyset(&set);
    sigaddset(&set, SIGUSR1); //добавляем USR1 в набор 
    sigaddset(&set, SIGUSR2); //добавляем USR2 в набор
    //маска блокировки - на время обработки сигнала, все остальные сигналы блокируются.
    //act.sa_mask = set;
    sigaction(SIGUSR1, &act, 0);
    sigaction(SIGUSR2, &act, 0);
    parent = getpid(); //запомним id процесса - предка
    child = fork();
    for (i = 0; i < 5; i++)
    {
        if (child == 0) //если нет - послать сигнал потомку
        {
            sigwait(&set, &sig);
            kill(parent, SIGUSR2);
        }
        if (child > 0)
        {
            
            kill(child, SIGUSR1);
            sigwait(&set, &sig);
        }
    }
    printf("\n");
    return 0;
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
15.12.2012, 21:00
Ответы с готовыми решениями:

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

Сигналы
Написать программу, которая получает в качестве аргумента командной строки имя файла, создаёт дочерний процесс, который читает содержимое...

сигналы
К примеру, имеем: процесс 1 создает второй и посылает сигнал второму. Правильно ли у меня написано дерево процессво? Непонятна суть...

6
Псевдослучайный
1946 / 1146 / 98
Регистрация: 13.09.2011
Сообщений: 3,215
15.12.2012, 21:55
Сигнал просто приходят до того, как процесс начинает его ждать.
1
 Аватар для Высокий
250 / 250 / 135
Регистрация: 09.04.2011
Сообщений: 524
15.12.2012, 22:08  [ТС]
хм. и как лечить?) воткнуть sleep перед sigwait-ом?
0
Псевдослучайный
1946 / 1146 / 98
Регистрация: 13.09.2011
Сообщений: 3,215
15.12.2012, 22:32
Пожалуй, будет лучше перенести подсчёт и отправку сигналов внутрь обработчика, оставив в главном цикле только ожидание. Не слишком удачно выбрано средство общения под задачу, сигналы всё-таки для асинхронщины скорее.
0
 Аватар для Высокий
250 / 250 / 135
Регистрация: 09.04.2011
Сообщений: 524
15.12.2012, 22:47  [ТС]
Цитата Сообщение от NoMasters Посмотреть сообщение
Не слишком удачно выбрано средство общения под задачу, сигналы всё-таки для асинхронщины скорее.
Знаю. Но задача так поставлена =_=
Перенес отправку сигнала в обработчик (за исключением первого сигнала), но все равно зависает в ожидании...
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
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
 
char byte = '0';
int child, parent;
//Функция, обработчик сигналов USR1 и USR2
void ReadWrite(int sig) 
{
    switch(sig)
    {
        case SIGUSR1: //USR1 = прочитать один байт из файла
        {
            FILE *file = fopen("lab4text", "r");
            printf("%d", fgetc(file));
            fclose(file);
            kill(parent, SIGUSR2);
        } break;
        case SIGUSR2: //USR2 = записать байт в файл (с перезаписью всего файла)
        {
            FILE *file = fopen("lab4text", "w");
            fprintf(file, "%d", byte);
            fclose(file);
            kill(child, SIGUSR1);
        } break;
    }
}
 
 
int main(void)
{
    int i, sig;
    struct sigaction act;
    memset(&act, 0, sizeof(act));
    /*Устанавливаем функцию ReadWrite как обработчик набора сигналов
      act*/
    act.sa_handler = ReadWrite; 
    sigset_t set; 
    sigemptyset(&set);
    sigaddset(&set, SIGUSR1); //добавляем USR1 в набор 
    sigaddset(&set, SIGUSR2); //добавляем USR2 в набор
    //маска блокировки - на время обработки сигнала, все остальные сигналы блокируются.
    //act.sa_mask = set;
    sigaction(SIGUSR1, &act, 0);
    sigaction(SIGUSR2, &act, 0);
    parent = getpid(); //запомним id процесса - предка
    child = fork();
    for (i = 0; i < 5; i++)
    {
        if (child == 0) //если нет - послать сигнал потомку
        {
            sigwait(&set, &sig);
        }
        if (child > 0)
        {
            if (i == 0) 
            {
                sleep(1);
                kill(child, SIGUSR1);
            }
            sigwait(&set, &sig);
        }
    }
    printf("\n");
    return 0;
}
0
Псевдослучайный
1946 / 1146 / 98
Регистрация: 13.09.2011
Сообщений: 3,215
15.12.2012, 23:26
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
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
 
 
int main()
{
    int i, sig, child, parent;
    char byte = '0';
    sigset_t set; 
    sigemptyset(&set);
    sigaddset(&set, SIGUSR1); //добавляем USR1 в набор 
    sigaddset(&set, SIGUSR2); //добавляем USR2 в набор
    sigprocmask(SIG_BLOCK, &set, NULL); 
    parent = getpid(); //запомним id процесса - предка
    child = fork();
    for (i = 0; i < 5; i++)
    {
        if (child == 0) //если нет - послать сигнал потомку
        {
            sigwait(&set, &sig);
            FILE *file = fopen("wut", "r");
            putchar(fgetc(file));
            fclose(file);
            kill(parent, SIGUSR2);
        }
        if (child > 0)
        {
            FILE *file = fopen("wut", "w");
            fputc(byte, file);
            fclose(file);
            kill(child, SIGUSR1);
            sigwait(&set, &sig);
        }
    }
    printf("\n");
    return 0;
}
Не нужен тут обработчик.
1
 Аватар для Высокий
250 / 250 / 135
Регистрация: 09.04.2011
Сообщений: 524
15.12.2012, 23:31  [ТС]
Спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.12.2012, 23:31
Помогаю со студенческими работами здесь

Сигналы в Linux (C/C++)
Привет) Всем добра Есть такая вот тема) Курсовая работа по сигналам в Linux) Очень нужна любая помощь- с чего начать, чем...

Задача на сигналы
порождаются два процесса( отец и сын) сын считывает инфу со стандартного ввода до конца файла если встречается '1', он отправляет отцу...

Процессы и сигналы
У меня такое задание &quot;Процесс 1 открывает файл и порождает потомков 2 и 3. Потомки пишут в файл по N байт и завершают работу. После этого...

Процессы и сигналы на Ubuntu
создать два процесса и сделать так что бы 1 посылал второму сигнал usr1 а второй первому usr2 и так до бесконечности

Создание процессов - Сигналы
Добрый вечер, форумчане! Начал осваивать с++ под linux не так давно. Не могу разобраться до конца с процессами. Подскажите,...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru