[UNIX] 프로세스 동기화 / exec 함수군

Taegang Yun·2023년 12월 8일
1

Unix 프로그래밍

목록 보기
11/19
  • execl()
    • 첫 인자인 arg()에는 실행 파일명을 지정
    • execl() 함수의 마지막 인자로는 인자의 끝을 의미하는 NULL 포인터(char * )를 지정해야함.
  • execlp()
  • execle()
  • execv()
  • execvp()
  • execvpe()
execlp("ls", "ls", "-a", (char*)NULL));

execv()

char *argv[3];

argv[0] = "ls";
argv[1] = "-a";
argv[2] = NULL;
execv("/usr/bin/ls", argv);

execve()

char *argv[3];
char *envp[2];

argv[0] = "arg.out";
argv[1] = "100";
argv[2] = NULL;

envp[0] = "MYENV=hanbit";
envp[1] = NULL;

execve("./arg.out", argv, envp);

fork와 execlp()

pid_t pid;

switch(pid = fork()){
	case 0:
		execlp("ls", "ls", "-a", (char*)NULL);
		exit(0);
		break;
	
	default:
		break;
}

좀비 프로세스

자식 프로세스가 모든 자원을 반납했어도 부모 프로세스가 종료 상태 정보를 받지 않거나 자식 프로세스보다 먼저 종료하는 경우가 발생.

실행을 종료한 후 자원을 반납한 자식 프로세스의 종료 상태 정보를 부모 프로세스가 받지 않는 경우 좀비 프로세스가 발생.

프로세스 동기화 : wait()

자식 프로세스가 종료할 때까지 부모 프로세스를 기다리게 함.

wait() 함수의 리턴값은 자식 프로세스PID

int status;
pid_t pid;

switch(pid = fork()){
	case 0:
		exit(2);

	default:
		while(wait(&status) != pid) continue;

}

프로그램 종료 : _exit()

  • 프로그램에서 직접 사용하지 않고 exit() 함수 내부에서 호출
  • 부모 프로세스에 종료 상태를 알림.
  • 자식 프로세스에 SIGHUP 시그널을 전송
  • 부모 프로세스에 SIGCHLD 시그널을 전송
  • 프로세스 강 통신에 사용한 자원을 반납

특정 자식 프로세스와 동기화 : waitpid()

  • 특정 PID 의 자식 프로세스가 종료하기를 기다림

  • 자식 프로세스의 종료 상태값을 status에 저장하고 options의 조건에 따라 리턴

  • 첫 번째 인자인 pid에 지정할 수 있는 값:

    • 1보다 작은 경우 : pid의 절댓값과 같은 프로세스 그룹 ID에 속한 자식 프로세스 중 임의의 프로세스의 상탯값을 요청
    • 1인 경우 : wait() 함수처럼 임의의 자식 프로세스의 상탯값을 요청
    • 0인 경우 : 함수를 호출한 프로세스와 같은 프로세스 그룹에 속한 임의의 프로세스의 상탯값을 요청
    • 0보다 큰 경우 : 지정한 pid에 해당하는 프로세스의 상탯값을 요청
  • 세 번째 인자인 options에 지정할 수 있는 값:

    • WCONTINUED : 수행 중인 자식 프로세스의 상탯값을 리턴
    • WNOHANG : pid로 지정한 자식 프로세스의 상탯값을 즉시 리턴받을 수 없어도 이를 호출한 프로세스의 실행을 블로킹하지 않고 다른 작업을 수행하게 함
    • WNOWAIT : 상탯값을 리턴한 프로세스가 대기 상태로 머물 수 있도록 함
    • WUNTRACED : 실행을 중단한 자식 프로세스의 상탯값을 리턴, 실행이 중단되었으므로 더 이상 상탯값을 리턴하지 않음
int status;
pid_t pid;

pid = fork();

if(pid == 0){
	sleep(3);
	exit(3);
}

while(waitpid(pid, &status, WNOHANG) == 0){
	sleep(1);
}
profile
언젠간 전문가가 되겠지

0개의 댓글