두 가지 유닉스 시그널만을 가지고 서버와 클라이언트간의 메세지 통신 프로그램을 만든다.
#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);
#include <signal.h>
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
#include <signal.h>
int sigemptyset(sigset_t *set);
#include <signal.h>
int sigaddset(sigset_t *set, int signo);
#include <signal.h>
int sigaction(int signum, const struct sigaction *restrict act,
struct sigaction *restrict oldact);
struct sigaction {
void (*sa_handler)(int); // signal 핸들러 함수
void (*sa_sigaction)(int, siginfo_t *, void *);
// 밑의 sa_flags가 SA_SIGINFO일때 sa_handler 대신에 동작하는 핸들러
sigset_t sa_mask; // 시그널 처리시 블록 지정할 시그널 마스크
int sa_flags; // sig_flag 기능 지정을 위한 상수
void (*sa_restorer)(void); // 응용프로그램 코드에서는 사용하지 말자.
}
#include <signal.h>
int kill(pid_t pid, int sig);
PID | 의미 |
---|---|
양의 정수 | 지정한 PID에 시그널 전송 |
0 | 함수를 호출하는 프로세스와 같은 그룹에 있는 모든 프로세스에 시그널 전송 |
-1 | 함수를 호출하는 프로세스가 전송할 수 있는 권한을 가진 모든 프로세스에 시그널 전송 |
-1 이외의 음수 | 첫 번째 인수 PID의 절댓값 프로세스 그룹에 속하는 모든 프로세스에 시그널 전송 |
#include <unistd.h>
pid_t getpid(void);
pid_t getppid(void);
#include <stdlib.h>
void *malloc(size_t size);
#include <stdlib.h>
void free(void *ptr);
#include <unistd.h>
int pause(void);
#include <unistd.h>
unsigned int sleep(unsigned int seconds);
#include <unistd.h>
int usleep(useconds_t usec);
#include <stdlib.h>
void exit(int status);
https://hydroponicglass.tistory.com/182
https://serverfault.com/questions/279178/what-is-the-range-of-a-pid-on-linux-and-solaris
https://www.geeksforgeeks.org/signals-c-set-2/
https://opensource.com/article/19/4/interprocess-communication-linux-networking