Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Синхроизация с помощью сигналов

5.3K
23 октября 2009 года
NewGP
58 / / 17.09.2006
Пишу программку, где один процесс открывает на чтение файл, создает дочерний процесс, читает n байт из файла, выводит их на экран, потом посылает sigusr1 дочернему процессу, тот делает тоже самое. Когда какой-либо процесс дойдет до конца файла, он отправляет другому sigusr2 и они завершаются.
Проблема в том, что дочерний процесс либо сразу виснет, когда ему sigusr1 пошлют, либо несколько раз примет и сделает как надо, а потом, когда ему родитель пошлет sigusr1, он опять виснет.
Вот код:

Код:
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <signal.h>
#include <fcntl.h>

#define FILENAME "file.txt"
#define BWR 512

int fd;
pid_t pd;

void sigHandler(int sig)
{
    signal(SIGUSR1, sigHandler);   
    //signal(SIGUSR2, sigHandler);
    switch(sig)
    {
        case SIGUSR1:
            PrintFile();
            break;
        case SIGUSR2:
            exit(0);
            break;
    }          
}

//Функция чтения файла
void PrintFile(void)
{
   
    static char buffer[BWR+1];
    static int bytes;

    pid_t pd1 = getpid();

    printf("\nProcess with PID = %d printing file:\n", pd1);
   
    bytes = read(fd, buffer, BWR);
    buffer[bytes] = '\0';
    printf("%s", buffer);
    if(bytes < BWR) {
        close(fd);
        printf("\nFile closed by PID = %d\n", pd1);
        printf("SIGUSR2 to PID %d\n", pd);     
        kill(pd, SIGUSR2);
        exit(0);
    }
    else {
        printf("\nSIGUSR1 to PID %d\n", pd);
        kill(pd, SIGUSR1);
        pause();
    }
}

int main(void)
{
    setpgrp();

    signal(SIGUSR1, sigHandler);
    signal(SIGUSR2, sigHandler);

    fd = open(FILENAME, O_RDONLY);
    if(fd == -1) {
        fprintf(stderr, "Cannot open file %s\n", FILENAME);
        return 1;
    }
    printf("Parent PID = %d\n", getpid());
   
    pd = fork();
    if(pd == 0) {
        printf("Child PID = %d\n", getpid());
       
        signal(SIGUSR1, sigHandler);
        signal(SIGUSR2, sigHandler);
        pd = getppid();

    }
    else
        PrintFile();
   
    return 1;
}
1.9K
23 октября 2009 года
disasm
232 / / 06.02.2006
Проблема в том, что вы ждёте сигнал в самом обработчике сигнала. Лучше убрать оттуда pause(); и поставить while(1) pause(); перед выходом их main()
5.3K
23 октября 2009 года
NewGP
58 / / 17.09.2006
Цитата: disasm
Проблема в том, что вы ждёте сигнал в самом обработчике сигнала. Лучше убрать оттуда pause(); и поставить while(1) pause(); перед выходом их main()


Точно! Большое спасибо!

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог