컴퓨터 공부/Advanced UNIX System Programming

[4월 30일 3교시] 프로세스2

려리군 2009. 4. 30. 11:22

fork : 프로세스 생성 

 - 부모 프로세스 : fork를 호출한 프로세스. 리턴값이 0이 아님

 - 자식 프로세스 : fork에 의해 생성된 프로세스. 리턴값이 0

exec : 프로그램 실행

 - 새로운 프로세스로 변경. -> 새로운 프로그램의 내용이 실행.

 - ID는 변하지 않음.


명령행 인자

 - argc : 인자들의 개수

 - argv[0] : 실행될 프로그램 이름

 - 인자들은 공백 문자에 의해 구분.

    예외) unix계열에선 "good morning"을 하나의 인자로 처리한다.


환경변수

 - 부모 프로세스에서 자식 프로세스로 전달됨.

 - 문자열의 형식은 "환경변수이름=값"

 - 문자열의 배열에 대한 포인터

 - 리스트의 마지막(을 구분해주는 표식)은 NULL포인터


환경변수 관련 변수

 - int main(int argc, char *argv[], char *envp[]);

 - extern char **environ;


환경변수 조작함수

#include<stdlib.h>

char *getenv(const char *name);

 - 기능 : "name=value"형식의 문자열을 찾아 value를 리턴. 

 - 리턴 : 성공시 환경 변수 값에 대한 포인터, 실패시 NULL

int putenv(const char *str);

 - 기능 

    "name=value"형식의 str문자열을 환경변수로 등록한다.

    "name"만 적으면 name이 존재할 때 해당하는 환경변수를 삭제한다.

 - 리턴 : 성공시 0, 실패시 0이 아닌 값.

 - 함수 내부적인 구현은 str포인터를 (따로 복사하지 않고) 그대로 사용한다.

    => global변수 혹은 malloc으로 할당하여 사용하여야 한다. 

    => 포인터를 사용하기 때문에 함수 호출 후 값을 바꾸면 환경변수 값도 바꾼다.


공유라이브러리

 - 프로그램에 라이브러리 루틴들을 포함하지 않음.

 - 필요시 라이브러리의 주소를 참조하여 실행.

 - 실행시 오버헤드 발생.


동적라이브러리

#include<stdlib.h>

void* malloc(size_t size);                          // size 바이트 메모리 할당.

void* calloc(size_t nobj, size_t size);         // 원소의 크기는 size이고 배열 개수는 nobj로 메모리 할당.

void* realloc(void* ptr, size_t newsize);     // 이미 할당 받은 영역의 크기를 조정.

리턴 : 성공시 할당받은 메모리에 대한 포인터, 실패시 NULL

void free(void* ptr);                                  // 메모리 해제. 메모리 누수를 막기 위해 꼭 필요.


#include<alloca.h>

void* alloca(size_t size);

기능 

 - 현재 함수의 스택 프레임에서 메모리 할당.

 - free함수 호출 없이 자동으로 메모리 해제.