리눅스에서 프로세스 시작과 관련된 함수 

: system(), fork()


종료와 관련된 함수

: wait(), waitpid(), exit()





##### system()


#include <dtdlib.h>

int system(const char    *string);

프로그램 수행도중 새로운 명령이나 프로그램 수행 가능

string : 명령 (sleep 3, ls ...)



##### fork()


#include<unistd.h>

pid_t fork(void);


프로세스 생성

부모프로세스로부터 만들어지며, 부모 프로세스와 같은 공간의 코드를 수행하지만 자기자신만의 데이터 공간 및 FDT등의 실행 환경을 구성

고유한 PID를 갖고, 부모프로세스의 PID를  자신의 PPID에 저장

부모 프로세스로부터 시그널 등도 상속받음

부모프로세스의 함수와 자식 프로세스의 함수에서는 서로 다른 값을 반환하여, 각 프로세스에서 수행할 일을 구분하게 됨

(부모 return : 정상 시 자식프로세스 PID, 자식 return : 정상 시 0)


fork() 실패 시 -1 rerutn.

- 메모리 부족 : errno 변수에 ENOMEM 설정

- 자식 프로세스 개수의 제한 : errno변수에 EAGAIN 설정



##### wait() 

: 자식프로세스의 종료까지 책임이 부여되는 함수


#include <sys/types.h>

#include <sys/wait.h>

pid_t wait(int *stat_loc);


case 1. 자식프로세스가 존재하는 경우

wait() 호출 -> 자식프로세스가 시그널을 보낼 때 까지 부모프로세스의 수행 중지 -> 자식프로세스의 PID반환

case 2. 자식프로세스가 존재하지 않는 경우

wait() 호출 -> -1 반환 -> errno 변수에 ECHILD 설정

case 3. 부모 프로세스에서 자식 프로세스의 종료 원인을 자세히 알고싶은 경우

인수로 상태정보를 읽어 올 수 있는 변수를 넘겨줌 -> 종료 상태 확인(sys/wait.h의 매크로 사용)


<관련 매크로>

'System > Linux Kernel' 카테고리의 다른 글

CFS 구현의 핵심  (0) 2016.01.22
커널에서 원하는 값을 가지고오기 위해 clz를 하는 이유  (0) 2016.01.16
[Unix V6] 시스템 부팅  (0) 2015.12.19
Device Tree, 리눅스 커널 4.0  (0) 2015.08.29
메모리관리  (0) 2015.08.18

리눅스에서는 shell(base)를 통해 명령 및 프로그램을 실행

환경변수는 명령이나 프로그램을 수행하는 데 필요한 정보를 가짐


HOME : 현재 로그인 사용자의 홈 디렉토리

PATH  : 명령을 검색할 디렉토리 목록. 리눅스 명령에 대한 실행 파일의 위치가 포함

PS1 : 쉘 프롬프트

MANPATH : 온라인 매뉴얼 검색 디렉토리 목록

USERNAME : 로그인 사용자 명

HOSTNAME : 사용중인 시스템의 호스트 명


c에서 getenv("환경변수명"); 으로 값을 얻어올 수 있음

<-> putenv();



##### 사용자 계정정보

/etc/passwd : 리눅스에서 사용자 계정정보를 보관하는 파일

계정, UID, GID, 홈디렉토리, 로그인 쉘 등을 포함한 상세한 정보를 저장


# include <sys/types.h>


struct passwd *getpwuid(uid_t uid);

struct passwd *getpwnam(const char *name);


struct passwd {

char *pw_name;

uid_t pw_uid;

gid_t pw_gid;

...

}



### UID

: 리눅스 사용자 ID


1. Real UID : 실제 로그인 한 사용자 계정의 UID


getuid(), getgid(), setuid(), setgid()


2. Effective UID : 파일 접근의 효과를 가지고 있는 UID

일반적으로 Real UID와 동일하나 set-UID 퍼미션이 설정된 프로그램을 수행하면 일시적으로 변경이 가능하며,

파일 접근에 대한 권한을 설정할 수 있음


geteuid(), getegid()



### PID

리눅스에서 모든 명령은 파일로 정의되며, 명령을 수행한다는 것은 해당 파일을 실행하는 프로세스가 동작한다는 것을 의미


getpid() : 현재 프로세스 ID 출력

getppid() : 현재 프로세스의 부모 프로세스 ID 출력


### time 

리눅스에서는 시스템 시간을 clock tick으로 세며 다음과 같은 함수들을 제공


time() 초단위 시간으로 확인 가능

gettimeofday() 마이크로 초 단위의 시간까지 확인 가능

times() 프로그램의 실행 시간을 확인하는 함수

uname() 시스템 호스트 정보. 시스템의 이름이나 OS 종류 및 버전 등에 대한 정보가 필요할 경우 사용

localtime() time()에서 구한 시간을 연,월,일,시,분,초의 형식으로 계산해주는 함수


### 시스템 자원의 제한치 설정


int getrlimit(int resource, struct rlimit *r_limit);

int setrlimit(int resource, const struct rlimit *r_limit);


struct rlimit {

rlim_t    rlim_cur;        // 현재 설정된 소프트 제한 값 확인

rlim_t    rlim_max;        // 절대적 제한치

};


<설정 가능한 리소스 종류>

RLIMIT_CPU

RLIMIT_FSIZE

RLIMIT_DATA

RLIMIT_STACK

RLIMIT_CORE

RLIMIT_NPROC

RLIMIT_NOFILE

RLIMIT_MEMLOCK



'System > Linux OS ' 카테고리의 다른 글

.exrc  (0) 2016.04.23
lsof  (0) 2015.12.24
strace, ltrace  (0) 2015.12.24
gcc / gdb  (0) 2015.12.24
man  (0) 2015.12.24


##### lsof

현재 동작 중인 모든 프로세스에 대한 오픈된 파일 보기


* 리눅스에서는 모든걸 파일로 관리하므로 유용하고 다양하게 쓰이는 명령어임


ex) 


$ sudo lsof -p 1052

특정한 1052번 프로세스가 오픈한 파일들의 목록


$ sudo lsof -i:22

네트워크가 연결되어있는 호스트나 포트로 확인


$ lsof -s /tmp

특정 파일 또는 디렉토리와 관련한 프로세스 찾기



'System > Linux OS ' 카테고리의 다른 글

.exrc  (0) 2016.04.23
리눅스 환경변수와 UID, PID, 시스템자원의 제한  (0) 2015.12.24
strace, ltrace  (0) 2015.12.24
gcc / gdb  (0) 2015.12.24
man  (0) 2015.12.24

+ Recent posts