사용함수-2(프로세스 생성 및 관리)

hyenam·2021년 12월 5일
0

minishell

목록 보기
3/6

fork

자식 프로세스를 만드는 함수

반환값

  • 프로세스 생성 성공기
    • 부모 프로세스에겐 자식 프로세스의 id가 반환
    • 자식 프로세스에겐 0 반환
  • 실패시 0반환
#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

waitpid

자식 프로세스가 종료하는 것을 기다리는 함수
wait함수와는 다르게 옵션을 지정할 수 있다.
wait4와 rusage값과 동일?


프로토 타입
pid_t waitpid(pid_t pid, int *stat_loc, int options);

pid(첫번째 인자)가

  • -1 일때
    임의의 자식 프로세스를 기다림
  • -보다 클때
    프로세스 id가 pid인 자식 프로세스를 기다린다
  • -1보다 작을때
    프로세스 그룹 id가 절댓값과 같은 자식 프로세스를 기다린다.
  • 0일때
    waitpid를 호출한 프로세스의 프로세스 그룹 pid와 같은 프로세스 그룹 id를 가진 프로세스를 기다린다

두번째 인자는 자식 프로세스가 상태를 저장한다.

세번째 인자

  • WCONTINUED
    정지했던 자식이 SIGCONT 전달로 재개된 경우에도 반환한다.
  • WNOHANG
    종료한 자식이 없으면 즉시 반환한다.
  • WUNTRACED
    자식이 정지한 경우에도 반환한다.
  • 0
    wait과 동일한 작동

주로 WNOHANG과 0을 사용한다고 한다.

반환값

  • 성공시 프로세스 id
  • 실패시 -1

세번째 인자에 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
자식 프로세스 종료.

종료한 자식이 없어 부모 프로세스부터 종료한 후 자식프로세스가 종료된다.

참고하면 좋은 글

wait3, wait4

프로토타입
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가 생긴후로는 둘다 구식 함수가 되었다고 한다.

참고하면 좋은 글

signal

헤더
#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가지가 있다.

  • SIGABRT
    비정상적인 종료
  • SIGFPE
    부동소수점 오류
  • SIGILL
    잘못된 명령
  • SIGINT
    터미널 인터럽트 신호.
  • SIGSEGV
    잘못된 메모리 참조.
  • SIGTERM
    종료 신호.

두번째 인자(void (*func)(int)) 함수포인터.

  • SIG_DFL
    기본 처리 - 신호는 해당 특정 신호에 대한 기본 작업으로 처리
  • SIG_IGN
    신호 무시 - 신호가 무시
  • 함수 이름
    지정 함수 오출

반환값
신호 처리 이전 값을 반환하거나 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입력하면 함수포인터가 작동함

kill

The kill utility sends a signal to the processes specified by the pid operands.


프로세스에 시그널을 보내는 함수

프로토타입
int kill(pid_t pid, int sig)

첫번째 인자

  • 양수일때
    지정한 프로세스 id에만 시그널 전송
  • 0
    함수를 호출하는 프로세스와 같은 그룹에 있는 모든 프로세스에 시그널 전송
  • -1
    함수를 호출하는 프로세스가 전송할 수 있는 구너한을 가진 모든 프로세스에 시그널 전송
  • -1보다 작은 음수
    첫번째 인수 pid 절대값 프로세스 그룹에 속하는 모든 프로세스에 시그널 전송

두번째 인자는 시그널 번호

반환값

  • 성공시 0
  • 실패시 -1
#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

profile
공부한 걸 정리하고 있습니다.

0개의 댓글