[리눅스 호출한 프로세스 복사본 생성하는 함수]
#include <unistd.h>
pid_t fork(void);
->성공 시 프로세스 ID, 실패 시 -1 반환
*부모 프로세스: fork 함수의 반환 값은 자식 프로세스의 ID
*자식 프로세스: fork 함수의 반환 값은 0
[리눅스 종료된 자식 프로세스의 ID 반환하는 함수]
#include <sys/wait.h>
pid_t wait(int *statloc);
->성공 시 종료된 자식 프로세스의 ID, 실패 시 -1 반환
*WIFEXITED: 자식 프로세스가 정상 종료한 경우 '참(true)' 반환한다.
*WEXITSTATUS: 자식 프로세스의 전달 값을 반환한다.
예시)
if (WIFEXITED(status)) //정상 종료하였는가?
{
puts("Normal termination!");
printf("Child pass num:%d", WEXITSTATUS(status)); //그렇다면 반환 값은?
}
[리눅스 종료된 자식 프로세스의 ID 반환하는 함수2]
#include <sys/wait.h>
pid_t waitpid(pid_t pid, int *statloc, int options);
->성공 시 종료된 자식 프로세스의 ID(또는 0), 실패 시 -1 반환
*pid: 종료를 확인하고자 하는 자식 프로세스의 ID 전달, 이를 대신해서 -1을 전달하면 wait 함수와 마찬가지로 임의의 자식 프로세스가 종료되기를 기다린다
*statloc: wait 함수의 매개변수 statloc과 동일한 의미로 사용된다.
*options: 헤더파일 sys/wait.h에 선언된 상수 WNOHANG을 인자로 전달하면, 종료된 자식 프로세스가 존재하지 않아도 블로킹 상태에 있지 않고, 0을 반환하면서 함수를 빠져 나온다.
*waitpid는 wait 함수가 블로킹 상태에 놓이는 문제를 해결할 수 있는 함수이다.
[리눅스 시그널 등록 함수]
#include <signal.h>
void (*signal(int signo, void (*func)(int)))(int);
->시그널 발생 시 호출되도록 이전에 등록된 함수의 포인터 반환
SIGALRM: alarm 함수호출을 통해서 등록된 시간이 된 상황
SIGINT: CTRL+C가 입력된 상황
SIGCHLD: 자식 프로세스가 종료된 상황
[리눅스 alarm 함수]
#include <unistd.h>
unsigned int alarm(unsigned int seconds);
->0 또는 SIGALRM 시그널이 발생하기까지 남아있는 시간을 초 단위로 반환
[리눅스 signal 함수보다 안정적인 sigaction 함수]
#include <signal.h>
int sigaction(int signo, cosnt struct sigaction *act, struct sigaction *oldact);
->성공 시 0, 실패 시 -1 반환
*signo: signal 함수와 마찬가지로 시그널의 정보를 인자로 전달
*act: 첫 번째 인자로 전달된 상수에 해당하는 시그널 발생시 호출될 함수(시그널 핸들러)의 정보 전달
*oldact: 이전에 등록되었던 시그널 핸들러의 함수 포인터를 얻는데 사용되는 인자, 필요 없다면 0 전달
struct sigaction
{
void(*sa_handler)(int);
sigset_t sa_mask;
int sa_flags;
}
[리눅스 파이프 생성 함수]
#include <unistd.h>
int pipe(int filedes[2]);
->성공 시 0, 실패 시 -1 반환
*filedes[0]: 파이프로부터 데이터를 수신하는데 사용되는 파일 디스크립터가 저장된다(파이프의 출구)
*filedes[1]: 파이프로부터 데이터를 전송하는데 사용되는 파일 디스크립터가 저장된다(파이프의 입구)
[리눅스 select 함수]
#include <sys/select.h>
#include <sys/time.h>
int select(int maxfd, fd_set *readset, fd_set *writeset, fd_set *exceptset, const struct timeval *timeout);
->성공 시 0 이상, 실패 시 -1 반환
*maxfd: 검사 대상이 되는 파일 디스크립터의 수
*readset: fd_set형 변수에 '수신된 데이터의 존재여부'에 관심 있는 파일 디스크립터 정보를 모두 등록해서 그 변수의 주소 값을 전달한다.
*writeset: fd_set형 변수에 '블록킹 없는 데이터 전송의 가능여부'에 관심 있는 파일 디스크립터 정보를 모두 등록해서 그 변수의 주소 값을 전달한다.
*exceptset: fd_set형 변수에 '에외상황의 발생여부'에 관심이 있는 파일 디스크립터 정보를 모두 등록해서 그 변수의 주소 값을 전달한다.
*timeout: select 함수호출 이후에 무한정 블록킹 상태에 빠지지 않도록 time-out을 설정하기 위한 인자를 전달
*반환값: 오류발생시에는 -1이 반환되고, 타임 아웃에 의한 반환 시에는 0이 반환된다. 그리고 관심대상으로 등록된 파일 디스크립터에 해당 관심에 관련된 변화가 발생하면 0보다 큰 값이 반환되는데, 이 값은 변화가 발생한 파일 디스크립터의 수를 의미한다.
fd_set형 변수에 값을 등록/변경하는 매크로
FD_ZERO(fd_set *fdset) |
인자로 전달된 주소의 fd_set형 변수의 모든 비트를 0으로 초기화 |
FD_SET(int fd, fd_set *fdset) |
매개변수 fdset으로 전달된 주소의 변수에 매개변수 fd로 전달된 파일 디스크립터 정보를 등록한다. |
FD_CLR(int fd, fd_set *fdset) |
매개변수 fdset으로 전달된 주소의 변수에서 매개변수 fd로 전달된 파일 디스크립터 정보를 삭제한다. |
FD_ISSET(int fd, fd_set *fdset) |
매개변수 fdset으로 전달된 주소의 변수에 매개변수 fd로 전달된 파일 디스크립터 정보가 있으면 양수를 반환한다. |
[윈도우 select 함수]
#include <winsock2.h>
int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *excepfds, const struct timeval *timeout);
*nfds: 검사 대상이 되는 파일 디스크립터의 수
*readfds: fd_set형 변수에 '수신된 데이터의 존재여부'에 관심 있는 파일 디스크립터 정보를 모두 등록해서 그 변수의 주소 값을 전달한다.
*writefds: fd_set형 변수에 '블록킹 없는 데이터 전송의 가능여부'에 관심 있는 파일 디스크립터 정보를 모두 등록해서 그 변수의 주소 값을 전달한다.
*excepfds: fd_set형 변수에 '에외상황의 발생여부'에 관심이 있는 파일 디스크립터 정보를 모두 등록해서 그 변수의 주소 값을 전달한다.
*timeout: select 함수호출 이후에 무한정 블록킹 상태에 빠지지 않도록 time-out을 설정하기 위한 인자를 전달
*반환값: 오류발생시에는 -1이 반환되고, 타임 아웃에 의한 반환 시에는 0이 반환된다. 그리고 관심대상으로 등록된 파일 디스크립터에 해당 관심에 관련된 변화가 발생하면 0보다 큰 값이 반환되는데, 이 값은 변화가 발생한 파일 디스크립터의 수를 의미한다.
typedef struct timeval
{
long tv_sec; //seconds
long tv_usec; //microseconds
}TIMEVAL;
typedef struct fd_set
{
u_int fd_count;
SOCKET fd_array[FD_SETSIZE];
}fd_set;
[리눅스 send 함수]
#include <sys/socket.h>
ssize_t send(int sockfd, const void *buf, size_t nbytes, int flags);
->성공 시 전송된 바이트 수, 실패 시 -1 반환
*sockfd: 데이터 전송 대상과의 연결을 의미하는 소켓의 파일 디스크립터 전달
*buf: 전송할 데이터를 저장하고 있는 버퍼의 주소 값 전달
*nbytes: 전송할 바이트 수 전달
*flags: 데이터 전송 시 적용할 다양한 옵션 정보 전달
[리눅스 recv 함수]
#include <sys/socket.h>
ssize_t recv(int sockfd, const void *buf, size_t nbytes, int flags);
->성공 시 수신한 바이트 수(단 EOF 전송시 0), 실패 시 -1 반환
*sockfd: 데이터 수신 대상과의 연결을 의미하는 소켓의 파일 디스크립터 전달
*buf: 수신할 데이터를 저장할 버퍼의 주소 값 전달
*nbytes: 수신할 수 있는 최대 바이트 수 전달
*flags: 데이터 수신 시 적용할 다양한 옵션 정보 전달
[send & recv 함수의 옵션과 그 의미]
옵션(Option) |
의미 |
send |
recv |
MSG_OOB |
긴급 데이터(Out-of-band data)의 전송을 위한 옵션 |
O |
O |
MSG_PEEK |
입력버퍼에 수신된 데이터의 존재유무 확인을 위한 옵션 |
|
O |
MSG_DONTROUTE |
데이터 전송과정에서 라우팅 테이블을 참조하지 않을 것을 요구하는 옵션 따라서 로컬 네트워크상에서 목적지를 찾을 때 사용되는 옵션 |
O |
|
MSG_DONTWAIT |
입출력 함수 호출과정에서 블로킹 되지 않을 것을 요구하기 위한 옵션 즉, 넌-블로킹 IO의 요구에 사용되는 옵션 |
O |
O |
MSG_WAITALL |
요청한 바이트 수에 해당하는 데이터가 전부 수신될 때까지, 호출된 함수가 반환되는 것을 막기 위한 옵션 |
|
|
[리눅스 writev 함수]
#include <sys/uio.h>
ssize_t writev(int filedes, const struct iovec *iov, int iovcnt);
->성공 시 전송된 바이트 수, 실패 시 -1 반환
*filedes: 데이터 전송의 목적지를 나타내는 소켓의 파일 디스크립터 전달, 단 소켓에만 제한된 함수가 아니기 때문에, read 함수처럼 파일이나 콘솔 대상의 파일 디스크립터도 전달 가능하다
*iov: 구조체 iovec 배열의 주소 값 전달, 구조체 iovec의 변수에는 전송할 데이터의 위치 및 크기 정보가 담긴다
*iovcnt: 두 번째 인자로 전달된 주소 값이 가리키는 배열의 길이정보 전달
struct iovec
{
void *iov_base; //버퍼의 주소 정보
size_t iov_len; //버퍼의 크기 정보
};
[리눅스 readv 함수]
#include <sys/uio.h>
ssize_t readv(int filedes, const struct iovec *iov, int iovcnt);
->성공 시 수신된 바이트 수, 실패 시 -1 반환
*filedes: 데이터를 수신할 파일(혹은 소켓)의 파일 디스크립터를 인자로 전달
*iov: 데이터를 저장할 위치와 크기 정보를 담고 있는 iovec 구조체 배열의 주소 값 전달
*iovcnt: 두 번째 인자로 전달된 주소 값이 가리키는 배열의 길이정보 전달
'C > TCPIP 소켓 프로그래밍(윤성우 저)' 카테고리의 다른 글
TCP/IP 소켓 프로그래밍 16장 내용 확인문제 (0) | 2017.07.16 |
---|---|
TCP/IP 소켓 프로그래밍 15장 내용 확인문제 (0) | 2017.07.12 |
TCP/IP 소켓 프로그래밍 6~9장 함수 복습 (0) | 2017.07.08 |
TCP/IP 소켓 프로그래밍 14장 내용 확인문제 (0) | 2017.07.01 |
TCP/IP 소켓 프로그래밍 13장 내용 확인문제 (0) | 2017.06.24 |