Академический Документы
Профессиональный Документы
Культура Документы
h>
#include <stdio.h>
#include <signal.h>
#include <string.h>
#include <sys/types.h>
// ------------------------------------------------------------------
void start_signalset(void);
// ------------------------------------------------------------------
void start_signalset(void)
{
if(signal(SIGUSR1, sig_func) == SIG_ERR) return ;
if(signal(SIGUSR2, sig_func) == SIG_ERR) return ;
//sigemptyset(&sig_m1);
sigemptyset(&sig_null);
sigaddset(&sig_m1,SIGUSR1);
sigaddset(&sig_m1,SIGUSR2);
if(sigprocmask(SIG_BLOCK, &sig_m1, &sig_m2) < 0) return ;
}
// ------------------------------------------------------------------Parent
void message_for_parents(pid_t pid)
{
kill(pid,SIGUSR2);
}
// ------------------------------------------------------------------
void wait_for_parents()
{
while(signal_flag == FALSE)sigsuspend(&sig_null);
signal_flag = FALSE;
if(sigprocmask(SIG_SETMASK, &sig_m2, NULL) < 0) return ;
}
// ------------------------------------------------------------------Child
void message_for_child(pid_t pid)
{
kill(pid, SIGUSR1);
}
// ------------------------------------------------------------------
void wait_for_child(void)
{
// d �������� ������� �������� ����� ���������� �������� ��������
while(signal_flag == FALSE) sigsuspend(&sig_null);
signal_flag = FALSE;
// �������� ������ ������������� � ������ ������ ���������
if(sigprocmask(SIG_SETMASK, &sig_m2, NULL) < 0) return;
}
// ------------------------------------------------------------------
int main()
{
pid_t pid;
char x,y;
if(pipe(fd) < 0)
{
printf("Can't create pipe\n");
return 1;
}
const int digit = 5;
start_signalset();
char child_digit;
int d = 15;
int accepted_didgit = 0;
for(x=2;x<=32;x+=2)
{
wait_for_parents();
char s_child_r[1];
memset(s_child_r, '\0', 2);
char r;
size = read(fd[0], s_child_r, 2);
if(size < 0)
{
printf("Can't write all string\n");
perror(NULL);
return;
}
printf("Child read -> %s\n",s_child_r);
if (s_child_r[0]=='1')
accepted_didgit += power(2.0,d);
d--;
message_for_parents(getppid());
}
printf("Child --> %d\n", accepted_didgit);
return ;
}
default :
{
char bit_d[16];
int iValue = digit;
int i,j;
printf("Digit is %d, or ==", digit);
for (i=0; i<16; i++, iValue<<=1)
{
bit_d[i] = (iValue & 0x8000)== 0 ? '0' : '1';
printf("%c",bit_d[i]);
}
printf ("\n");
int f=0;
for(y=1;y<=31;y+=2)
{
char s_parent_w[2];
s_parent_w[0] = bit_d[f++];
s_parent_w[1] = '\0';
message_for_child(pid);
wait_for_child();
}
return 0;
}
}
printf("\n\n");
close(fd[0]);
close(fd[1]);
return 0;
}