Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.05.2012, 15:42   #1
ol-k_34
Пользователь
 
Регистрация: 08.02.2012
Сообщений: 31
Восклицание Программирование под Unix. Сигналы

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

вот мой код, но он не работает хоть убей:

#include<signal.h>
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
#include<stdlib.h>

void p_action(int sig)
{
FILE *fd;
char line[11];
if ((fd=fopen("1.txt","r"))==NULL)
{
printf("error\n");
exit(1);
}
while(!feof(fd))
{
printf("%d\n",getpid());
if(fgets(line,11,fd))
printf("%s\n",line);
}
fclose(fd);
}
void c_action(int sig)
{
FILE *fd;
char line[11];
if ((fd=fopen("1.txt","r"))==NULL)
{
printf("error\n");
exit(1);
}
while(!feof(fd))
{
printf("%d\n",getpid());
if(fgets(line,11,fd))
printf("%s\n",line);
}
fclose(fd);
}

void handler(int s)
{
alarm(10);
signal(SIGALRM,handler);
printf("10 seconds\n");
}

int main(int argc, char **argv)
{
static struct sigaction pact, cact;
pid_t pid,pid1,pid2;
FILE *fd;
int c;
char line[11];

pid1=fork();
pid2=fork();

for(;;)
{
signal(SIGALRM,handler);
alarm(10);
pause();
}

if(pid1==0)
{
cact.sa_handler=c_action;
sigfillset(&(cact.sa_mask));
sigaction(SIGUSR1,&cact,NULL);
pid2=getpid();

for(;;)
{
sleep(1);
kill(pid2,SIGUSR1);
pause();
}
}else if(pis2==0)
{
pid1=getpid();

pact.sa_handler=p_action;
sigfillset(&(pact.sa_mask));
sigaction(SIGUSR2,&pact,NULL);

for(;;)
{
sleep(1);
kill(pid1,SIGUSR1);
pause();
}
}
else
waitpid((int*)0);
waitpid((int*)0);
exit(0);
alarm(0);
}
ol-k_34 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
UNIX. Профессиональное программирование mihali4 Linux (Ubuntu, Debian, Red Hat, CentOS, Mint) 3 01.07.2013 02:04
strcpy| программирование под Unix Демик Общие вопросы C/C++ 6 30.03.2012 15:14
Язык С под Unix. Roukert Фриланс 0 23.12.2011 16:25
Компиляторы под Unix VKorablev Софт 2 17.04.2011 23:15