Добавил:
Fragga
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:лабораторки по ОС препод Челноков / 2семестр / wi2 / olesha / lab3
.c#include <sys/types.h>
#include <unistd.h>
#include <signal.h>
#define MSGSIZE sizeof(int)
int ntimes = 0;
int p1[2];
int p2[2];
main(){
pid_t pid, ppid;
void p_action(int), c_action(int);
static struct sigaction pact, cact;
char inbuf[MSGSIZE];
int j = 0;
if(pipe(p1) == -1){
perror("pipe");
exit(1);
}
if(pipe(p2) == -1){
perror("pipe");
exit(1);
}
pact.sa_handler = p_action;
sigaction(SIGUSR1, &pact, NULL);
switch(pid = fork()){
case -1:
perror("fork");
exit(1);
case 0:
cact.sa_handler = c_action;
sigaction(SIGUSR1, &cact, NULL);
ppid = getppid();
close(p1[1]);
close(p2[0]);
write(p2[1], &j, MSGSIZE);
for(;;){
sleep(1);
kill(ppid, SIGUSR1);
pause();
}
default:
close(p1[0]);
close(p2[1]);
for(;;){
pause();
sleep(1);
kill(pid, SIGUSR1);
}
}
}
void p_action(int sig){
int k;
read(p2[0], &k, MSGSIZE);
printf("parent recived: %i", k++);
//k++;
write(p1[1], &k, MSGSIZE);
printf("\nparent call #: %d\n", ++ntimes);
}
void c_action(int sig){
int k;
read(p1[0], &k, MSGSIZE);
printf("chaild recived: %i", k++);
write(p2[1], &k, MSGSIZE);
printf("\nchaild call #: %d\n", ++ntimes);
}