- unix 신호를 주고 받는 작은 데이터 교환 프로그램 코딩
- 글자를 이진법으로 바꾸고 → 8비트 만큼 쪼개서 보냄 → 이를 받는 곳에서 다시 8bit를 1byte로 바꿔야함(복원)
client는 server의 pid와 송신할 문자열을 입력 인자로 받는다
./client <pid> "String"
형태의 인자 3개7-bit index
만큼 비트 시프트kill(SIGUSR1)
or kill(SIGUSR2)
write
함수를 호출한다. 이 write
함수를 호출할 때 걸리는 시간을 감안하여 usleep()
을 해준다.본인의 PID 정보 출력, 문자열이 수신되면 해당 문자열 표시
sa_sigaction
핸들러를 사용하기 위해 SA_SIGINFO
를 넣음sigaction
SIGUSR1, SIGUSR2
- ft_atoi 함수 주의 (
pid=ft_atoi(argv[1])
)
- 문자열로 들어온 pid를 int형으로 저장하기 위해 atoi 함수를 사용하게 된다. 이때,
ft_atoi
함수의 오버플로우, 언더플로우 처리를 주의해야 한다.man atoi
를 보면 다음과 같이 manual이 적혀있다.
strtol
함수와 동일한 함수라면strtol
의 오버플로우, 언더플로우 처리와 동일해야 할 것이다.strtol
은 언더플로우가 발생했을 경우에는LONG_MIN
을 반환하고 오버플로우가 발생했을 때는LONG_MAX
를 반환한다. 그러므로ft_atoi
도 이 반환값들로 처리를 해줘야한다.
사실, libft 과제를 할 때 진작 처리를 해놓아야 했을 부분인데 나도 평가자도 아무도 캐치하지 못했었다. 나처럼 사람들이 이 부분을 놓치고 다음 과제를 진행하는 경우가 대다수인 것 같다. 다행히도 이번 minitalk 과제를 평가 받으면서ft_atoi
의 제대로 된 처리를 배우게 되었다. (jaham님 감사합니당)
- unicode 작동 원리
unsigned char
로 형변환 해서 128~255까지 처리 (char는 첫 번째 bit를 부호비트로 사용하지만 unsigned char는 부호를 고려하지 않는 1바이트 메모리. 즉,unsigned char
는 8개 비트를 모두 데이터 비트로 생각하고 작업 진행)- UTF-8을 이해 할 필요가 있음. UTF-8은 1~4바이트로 인코딩 될 수 있으며 ASCII 문자와 호환이 된다.
- 클러스터 맥기준 UTF-8를 사용하는데 UTF-8은 가변 인코딩 방식으로 되어있음
- flag에
SA_SIGINFO
를 사용해야 하는 이유
- 이 과제에서는 SIGUSR1, SIGUSR2만 사용하는데 이 둘은 default로 지정된 동작은 프로세스의 종료
sa_flag
에서SIGINFO
를 사용하지 않을 경우,sa_handler
로 신호를 다루고,SIGINFO
를 대입하면sa_sigaction
으로 신호를 다룬다.sa_handler
와sa_sigaction
둘 다handler
인데,sa_handler
는 인자 1개,sigaction
은 인자 3개 필요함. 두 개를 동시에 사용할 수 없고, 둘 중에 하나만 사용해야 함. 어떤 거 사용할지를sa_flags
옵션에서 알 수 있음
signal
과sigaction
차이
sigaction
함수를 사용하기 위해서는sigaction
구조체를 프로그램 코드 내부에 선언.signal
함수는 핸들러 함수를 등록하기 위해 사용하지만,sigaction
함수는sigaction
구조체를 선언하고 내부에 핸들러를 등록한 뒤 그 구조체를 사용하기 때문signal
함수와sigaction
사이에 가장 큰 차이점은sa_flag
를 이용한 다양한 기능의 지원- 기본적으로
signal
함수를 사용해서 신호를 컨트롤 할 수 있지만,sigaction
함수는sigaction
구조체를 사용해서 좀 더 다양한 정보를 가지고 신호를 다룰 수 있다
- client 함수에서
usleep
을 사용해야 하는 이유
- 비트 8개를 송신하면 서버 측에서 출력 함수를 호출하므로 출력 함수 호출 시에 걸리는 시간을 감안하여 micro sec만큼 실행을 늦춘다. (씹힘 방지)