티스토리 뷰

활동/42Seoul

[minitalk] 이해 및 실행

geonwoopaeng@gmail.com 2021. 6. 26. 20:57

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(2) - Linux manual page

sigaction(2) — Linux manual page SIGACTION(2) Linux Programmer's Manual SIGACTION(2) NAME         top sigaction, rt_sigaction - examine and change a signal action SYNOPSIS         top #include int sigaction(int signum, const struct sigaction *res

man7.org

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

https://jybaek.tistory.com/112

반응형

'활동 > 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
공지사항
최근에 올라온 글