자식 프로세스를 만드는 함수
반환값
#include<stdio.h>
#include<unistd.h>
int main(void)
{
pid_t pid;
pid = fork();
if (pid > 0)
printf("부모 프로세스. ID : %d\n", getpid());
else if (pid == 0)
printf("자식 프로세스. ID : %d\n", getpid());
}
출력 결과
부모 프로세스. ID : 24340
자식 프로세스. ID : 24341
자식 프로세스가 종료하는 것을 기다리는 함수
wait함수와는 다르게 옵션을 지정할 수 있다.
wait4와 rusage값과 동일?
프로토 타입
pid_t waitpid(pid_t pid, int *stat_loc, int options);
pid(첫번째 인자)가
두번째 인자는 자식 프로세스가 상태를 저장한다.
세번째 인자
주로 WNOHANG과 0을 사용한다고 한다.
반환값
세번째 인자에 0을 넣었을때
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
int main(void)
{
pid_t pid;
int status;
pid = fork();
if (pid > 0)
{
printf("부모 프로세스. ID : %d\n", getpid());
int ret;
ret = waitpid(pid, &status, 0);
printf("부모 프로세스 종료.\n");
}
else if (pid == 0)
{
printf("자식 프로세스. ID : %d\n", getpid());
usleep(100);
printf("자식 프로세스 종료.\n");
}
}
실행결과
부모 프로세스. ID : 27848
자식 프로세스. ID : 27849
자식 프로세스 종료.
부모 프로세스 종료.
자식 프로세스가 종료된 후 부모 프로세스가 종료된다.
세번째 인자에 WNOHANG을 넣었을때
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
int main(void)
{
pid_t pid;
int status;
pid = fork();
if (pid > 0)
{
printf("부모 프로세스. ID : %d\n", getpid());
int ret;
ret = waitpid(pid, &status, WNOHANG);
printf("부모 프로세스 종료.\n");
}
else if (pid == 0)
{
printf("자식 프로세스. ID : %d\n", getpid());
usleep(100);
printf("자식 프로세스 종료.\n");
}
}
실행결과
부모 프로세스. ID : 27938
부모 프로세스 종료.
자식 프로세스. ID : 27939
자식 프로세스 종료.
종료한 자식이 없어 부모 프로세스부터 종료한 후 자식프로세스가 종료된다.
프로토타입
pid_t wait3(int *statloc, int options, struct rusage *rusage); pid_t wait4(pid_t pid, int *statloc, int options, struct rusage *rusage);
wait3는 waitpid(-1, status, options)
이것과 동일하게 동작한다고 한다.
wait4는 waitpid와 동일하게 동작한다고 한다.
둘의 차이는 4는 자식 프로세스를 특정할 수 있다는 점.
waitpid가 생긴후로는 둘다 구식 함수가 되었다고 한다.
헤더
#include <signal.h>
프로토 타입
void (*signal(int sig, void (*func)(int)))(int);
다른 버전
typedef void (*sig_t) (int); sig_t signal(int sig, sig_t func);
신호를 처리하는 함수.
man 페이지를 보면 sigaction(2) 함수보단 좀더 심플한 함수라고 한다.
첫번째 인자 (int sig)에 들어가는 신호의 종류는 6가지가 있다.
두번째 인자(void (*func)(int)) 함수포인터.
반환값
신호 처리 이전 값을 반환하거나 SIG_ERR반환
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
void sighandler(int sig)
{
printf("sighandler\n");
exit(0);
}
int main(void)
{
signal(SIGINT, sighandler);
while(1)
;
}
출력결과
^Csighandler
ctrl+c는 SIGINT인터럽트라 코드 실행하고 ctrl+c입력하면 함수포인터가 작동함
The kill utility sends a signal to the processes specified by the pid operands.
프로세스에 시그널을 보내는 함수
프로토타입
int kill(pid_t pid, int sig)
첫번째 인자
두번째 인자는 시그널 번호
반환값
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
#include <signal.h>
int main(void)
{
pid_t pid;
int status;
pid = fork();
if (pid > 0)
{
printf("부모 프로세스. ID : %d\n", getpid());
int ret;
ret = waitpid(pid, &status, 0);
printf("부모 프로세스 종료.\n");
}
else if (pid == 0)
{
printf("자식 프로세스. ID : %d\n", getpid());
usleep(100);
kill(pid, SIGKILL);
printf("자식 프로세스 종료.\n");
}
}
실행결과
부모 프로세스. ID : 98062
자식 프로세스. ID : 98063
[1] 98062 killed ./test
항상 부모가 먼저 죽는다.
학습에 참고한 사이트
wait
fork
waitpid
signal
kill