본문 바로가기
Linux

사물인터넷 기반 융합기술 교육 - 리눅스프로그래밍 3일

by Luhie 2017. 7. 19.

시그널의 의미

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)

자식 프로세스가 종료하면 종료 상태 값과 함게 즉시 리턴

에러 발생 시에는 즉시 리턴(자식 프로세스가 없는 경우)