Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
4
Добавлен:
26.05.2014
Размер:
1.25 Кб
Скачать
#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);
}
Соседние файлы в папке olesha