10진수를 2진수로 변환해 출력하는 방법은 다음과 같다.
7번부터 0번까지 >>연산을 한 후 1(00000001)과 &연산을 하면 맨 마지막 숫자만 살아남는다.
제일 처음 message를 7번 >>연산하면 10000000 혹은 00000000이 되고, 이를 00000001과 &연산하면 1 또는 0만 살아남는다. 이를 7번 >> 연산 ~ 0번 >>연산 이렇게 반복하면 message가 왼쪽부터 차례대로 2진수로 변환된다.
void decimalToBin(char message)
{
int result;
int i;
result = 0;
i = 7;
while (i >= 0)//8bit까지 표현
{
result = message >> i & 1;//>>연산 후 &연산하기.
printf("%d", result);
i--;
}
}
우리는 여기서 10진수를 2진수로 바꾸어 출력하는 것 대신 2진수로 바꾸었을 때의 값이 0이면 sigusr1 시그널을, 값이 1이면 sigusr2 시그널을 서버의 pid로 보낼 것이다.
단, kill로 시그널을 보내 주었을 때의 리턴값이 -1이면 시그널을 보내는 데에 실패한 것이므로 예외처리를 해 주어야 한다.
또 보내는 데에 시간이 걸리므로 usleep으로 일정 ms동안 대기한다.
printf문 대신 kill을 쓴 함수는 아래와 같다.
void decimalToBin(int pid, char message)
{
int result;
int i;
result = 0;
i = 7;
while (i >= 0)//8bit까지 표현
{
result = message >> i & 1;//>>연산 후 &연산하기.
if (result == 0)
{
if (kill(pid, SIGUSR1) == -1)
{
printf("failed to send message\\n");
exit(0);
}
}
else if (result == 1)
{
if (kill(pid, SIGUSR2) == -1)//kill을 했을 때 -1이면 에러
{
printf("failed to send message\\n");
exit(0);
}
}
i--;
usleep(100);
}
}