시그널의 의미
SIGABRT SIGALRM SIGCHLD SIGCONT SIGFPE SIGGUPSIGILL SGINT SIGKILL
SIGQUIT SIGSEGV SIGSTOP SIGTERM SIGTSTP SIGUSR1 SIGUSR2
시그널 발생함수
kill /raise
sig 인자
시그널 번호
null signal (0) 실제로 시그널을 보내지 않고 프로세스의 존재 여부를 파악하는 데 사용한다. 존재하지 않는 프로세스에 대한 kill 함수 호출은 에러(-1)를 리턴하고 errno에 ESRCH를 저장
pid 인자의 지정 방법
pid>0
pid ==0 호출한 프로세스와 같은 프로세스 그룹 id를 가지고 권한이 있는 모든 프로세스에게 시그널을 전달
pid < 0 pid의 절대값에 해당하는 프로세스 그룹 ID를 가지고 있는 권한이 있는 모든 프로세스에게 시그널을 전달
pid == -1 사용되지 않는 값
시그널 처리 방법의 선택
signo 인자 시그널 번호
func 인자
sig_ign 지정한 시그널을 무시 ((void(*)())1)
sig_DFL 기본 처리 방법에 따라 처리한다. ((void(*)()) 0)
사용자 정의 함수 : 시그널이 발생하면 호출될 함수의 주소 하나의 정수형 인자를 갖고 리턴 값이 없는 함수에 대한 포인터
리턴값 지정한 시그널에 대한 이전가지의 처리방법
sigaction
지정한 시그널에 대한 처리 방법을 변경하거나 검사
signo 인자 : 시그널 번호
act 인자 : sigaction 데이터 형으로서 시그널에 대한 변경될 처리 방법을 지정.
프로세스 관리용 자료구조
사용자구조 프로세스 테이블 프로세스 영역 테이블 메모리
엔트리 텍스트,데이터,스택 텍스트 데이터 스택
사용자 구조
user.h 에 정의
시스템 호출에 의해 리턴된 에러 코드
파일 접근 권한을 결저하기 위한 실제/유효 사용자/그룹 id
현재 디렉토리 루트 디렉토리, 부모 디렉토리의 inode
프로세스에 의해 open된 파일의 파일 기술자들(file descriptortalbe)
현재 시스템 호출 인자들
텍스트 스택 데이터 세그먼트의 크기
프로세스 테이블
<proc.h.>
프로세스의 종료작업
exit함수는 표준 입출력 정리 루틴을 수행하고 _exit를 호출
open된 file stream에 대해 fclose호출, 버퍼에 남은 데이터를 flush
exit 함수
stdlib.h
_exit함수
unistd.h
status 인자의 하위 8비트만 사용(0~255)
_붙은 것은 커널과 직접적인 연관이 있다.
사실은 역순으로 !!! 스택!
#include <stdio.h>
#include <stdlib.h>
void my_exit1(void){
printf("my-exit1 called\n");
}
void my_exit2(void){
printf("my-exit2 called\n");
}
void my_exit3(void){
printf("my-exit3 called\n");
}
int main() {
if(atexit(my_exit1) != 0)
perror("e1");
if(atexit(my_exit2) != 0)
perror("e2");
if(atexit(my_exit3) != 0)
perror("e3");
}
고아 프로세스와 좀비
고아 프로세스(orphaned process)
자식 프로세스가 종료하기 전에 부모 프로세스가 수행을 마친경우의 자식프로세스
한 프로세스가 종료하는 경우, 커널은 자식 프로세스를 찾아 init 프로세스의 자식이 되도록 설정
좀비 프로세스
종료 했으나 부모 프로세스의 wait 처리가 끝나지 않은 프로세스
커널이 프로세스 Id, 종료 상태 값, cpu사용 시간 등의 정보를 유지
프로세스 그룹
pid_t getpgrp (void);
프로세스의 프로세스 그룹 id를 반ㄴ환
- 양수의 식별자
프로세스 id = 프로세스 그룹 id = 세션 id
system 함수 리턴 값
fork 함수와 exec 함수
프로세스의 생성(fork)
호출한 프로세스와 동일한 프로세스를 새로 생성하여 새로운 프로세스 ID를 할당한다
부모 프로세스 : fork를 호출한 프로세스
자식 프로세스 : fork에 의해 생성되는 프로세스
프로그램의 실행(exec)
호출한 프로세스를 새로운 프로세스로 변경한다
호출 후의 프로세스 ID는 변하지 않는다
새로운 프로그랜의 내용이 실행된다.
fork시 지역변수를 복사하여 사용!!!
프로세스의 식별
자식은 죽었지만 스택 메모리에서 공유하고 있다.?
fork는 공유 안하지만 복사할 준비를 하고 있다. wait 좀비가 되지 않게.
프로세스의 생성(fork)
fork 성공
생성된 자식 프로세스와 부모 프로세스와 동일한 프로그램
fork 호출 다음 문장부터 동시에 실행
(분리되고 동시에 실행)
자식 프로세스의 메모리 공간
커널은 자식 프로세스를 프로세스 테이블에 등록하고 메모리를 할당
텍스트 영역은 공유하고, 데이터, 힙, 스택 영역은 복사
대부분의 시스템에서 데이터, 힙, 스택 영역을 바로 보사하지 않는다.
fork 이후에 보통 exec이 호출되기 대문에
변형 시에 복사 (copy-on-write, COW)방법을 사용
자식과 부모 프로세스의 구분
fork 함수의 리턴 값으로 구분한다.
부모 프로세스 : 생성된 자식 프로세스의 PID
자식 프로세스 : 0
사용 예)
pid_t pid;
if((pid = fork()) < ))
esle if (pid == 0)
do job B;
else
do job A
fork 함수의 반환 값
부모 프로세스 : 여러 자식 프로세스를 각 fork의 리턴 값으로 구분
자식 프로세스 : getppid 함수를 이용하여 부모 프로세스 식별
PID가 0인 프로세스 : swapper(sched)로서 시스템 부팅 시 생성 되며 fork에 의해 다시 생성되지 않는다.
fork 를 통한 파일의 공유
open 함수를 각각 호출
서로 다른 프로세스가 같은 파일을 각각 open하면 서로 다른 파일 테이블 엔트리에 서 서로 다른 옵셋을 가지면서 공유
fork 함수 호출
fork함수 호출 이전에 open된 파일을 자식 프로세스가 공유
같은 파일 테이블 엔트리, 같은 옵셋
fork를 통해 상속되는 속성
실제/유효 사용자 id, 실제/유효 그룹 id
보조 그룹 id
open된 파일 디스크립터
자원 제약
환경변수
fork 이후에 달라지는 속성
fork 함수의 리턴값
프로세스 id, 부모 프로세스 id
부모 프로세스의 파일 잠금(file locks)은 상속되지 않는댜 ** 중요
처리되지 않은 pending 알람(alarm)과 시그널은 자식 프로세스에서 초기화
fork 함수의 일반적인 용도
동일한 프로그램의 실행
같은 프로그램을 복제하여 부모와 자식이 각각 다른 코드 부분을 동시에 실행해야 하는 경우
예: 네트워크 서버
새로운 프로그램의 실행
자식 프로세스는 fork 후에 exec 함수를 호출하여 새로운 프로그램을 실행한다.
예: 쉘(Shell)
vfork 함수
vfork 함수는 exec 함수를 통해 새로운 프로그램을 실행시킬 목적으로 자식 프로세스를 생성
-부모 프로세스의 메모리 영역을 모두 복사 하지 않는다.
자식 프로세스는 exec 이나 exit 호출을 할 때까지 부모 프로세스의 메모리 영역에서 실행되며, 부모 프로세스는 실행을 멈춘다.
- 자식 프로세스가 항상 먼저 실행되는 것을 보장
프로세스에 대한 대기 (wait)
자식 프로세스의 종료 샅애 값을 얻어내는 방법
프로세스가 종료하면 부모 프로세스에게 SIGCHld 시그널을 전달하여 대기 (block)상태를 해제
wait 함수의 동작
모든 자식 프로세스가 실행되고 있는 동안 대기한다(block)
자식 프로세스가 종료하면 종료 상태 값과 함게 즉시 리턴
에러 발생 시에는 즉시 리턴(자식 프로세스가 없는 경우)
'Linux' 카테고리의 다른 글
사물인터넷 기반 융합기술 교육 - 리눅스프로그래밍 2일 (2) | 2017.07.18 |
---|---|
사물인터넷 기반 융합기술 교육 - 리눅스프로그래밍 1일 (2) | 2017.07.17 |
[ubuntu] root 권환으로 변경 (0) | 2017.03.31 |