티스토리 뷰
minitalk
< 전반적인 이해 >
https://www.joinc.co.kr/w/Site/system_programing/Book_LSP/ch06_Signal
- client 와 server 사이의 communication(문자열)
- server는 먼저 시작되어야하며 시작된 후에 PID를 표시한다.
- client는 [server_PID] [string] 를 매개 변수로 사용한다.
- client는 매개 변수로 전달 된 문자열을 server에 전달한다. (문자열이 수신되면 server는 이를 표시해야합니다.)
- 프로그램 간의 통신은 UNIX 신호를 사용해서만 이루어져야한다.
- server는 문자열을 매우 빠르게 표시 할 수 있어야한다. (힌트 : 100 자에 대해 1 초는 COLOSSAL).
- server를 다시 시작할 필요없이 여러 client로 연속으로 문자열을받을 수 있어야한다.
- SIGUSR1 및 SIGUSR2 신호 만 사용할 수 있다.
실행
- server terminal
./server
- client terminal
- server_id: server 실행해서 나온 id
./client [server_id] [문자열]
문자열 들어간 속도 파악
#include <time.h>
#include <stdio.h>
//...
void ft_send_message(int server_id, char *msgs)
{
int idx;
clock_t start = clock(); //속도
idx = 0;
while (msgs[idx] != '\0')
{
ft_binary_send(server_id, msgs[idx]);
idx++;
}
ft_binary_send(server_id, '\0');
clock_t end = clock(); // 속도
printf("sec 속도: %lf\n", (double)(end - start)/CLOCKS_PER_SEC); //속도
}
//...
kill()
- process에 signal을 전달하기위해 사용하는 함수
int kill(pid_t process_id, int sig);
// process_id로 sig를 보낸다.
Unix 신호
https://ko.wikipedia.org/wiki/%EC%9C%A0%EB%8B%89%EC%8A%A4_%EC%8B%A0%ED%98%B8
posix
https://ko.wikipedia.org/wiki/POSIX
SIGUSR1, SIGUSR2
- "특별한" 사전 정의 된 의미없이 사용자가 사용하도록 예약된 신호
signal()
- signal 처리를 설정
// ctrl + c 눌렀을 때 signal 받아오게 하기
// => ctrl + c로 프로그램 종료 대신 ft_handler실행
// SIGINT == ctrl + c
#include <signal.h>
#include <unistd.h>
#include <stdio.h>
void ft_handler(int signum)
{
printf("시그널 받았습니다.(%d)\n", SIGINT);
sleep(2);
}
int main(int argc, char *argv[])
{
int idx;
idx = 0;
signal(SIGINT, (void *)ft_handler);
while (1)
{
printf("process 실행 중 %d\n", idx);
sleep(1);
idx++;
}
}
sigaction()
- signal() 와 마찬가지로 특정 신호를 수신하기 위해 사용합니다.
- signal을 객체 단위로 제어 할 수 있다.
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=skssim&logNo=121271980
https://man7.org/linux/man-pages/man2/sigaction.2.html
sigaction struct
struct sigaction {
int sa_flags;
union {
void (*sa_handler)();
void (*sa_sigaction)(int, siginfo_t *, void *);
}_funcptr;
}
sa_handler, sa_sigaction
- sa_handler, sa_sigaction은 메모리가 중첩됩니다.
sa_flags != SA_SIGINFO //이면 sa_handler 멤버 사용
sa_flags = SA_SIGINFO //이면 sa_sigaction 멤버 사용
//=====================================================//
//handler()
void handler(int signum, siginfo_t *sip, ucontext_t *ucp)
// signum: signal handler을 호출할 signal
// sip: signal이 발생한 원인을 담은 곳
// ucp: signal이 전달될 때 signal을 받는 process의 내부 상태
//======================================================//
//sigaction()
int sigaction(int signum, const struct sigaction *act, const struct sigaction *oldact)
// signum: 처리할 signal
// act: signal을 처리할 방법을 지정한 구조체 주소
// oldact: 기존에 signal을 처리하던 방법을 저장할 구조체 주소
SA_SIGINFO
- 시스템에 지정된 신호 동작을 사용하도록 지시한다
pause()
https://man7.org/linux/man-pages/man2/pause.2.html
- signal을 수신할 때까지 대기합니다.
pid 범위
https://stackoverflow.com/questions/16599463/what-is-the-value-range-of-thread-and-process-id
반응형
'활동 > 42Seoul' 카테고리의 다른 글
[philosophers] 문제 해결 (0) | 2021.08.03 |
---|---|
[용량 부족] 일 경우(linux + wsl2) (0) | 2021.06.19 |
[push_swap] 풀이과정 (0) | 2021.06.19 |
[cub3d] Ray-Casting (0) | 2021.02.15 |
[miniRT] Ray_Tracing (0) | 2021.02.04 |
공지사항
최근에 올라온 글