부산IT학원/스마트컨트롤러

20140619 (프로세스, 함수 포인터)

EHOzlO 2014. 6. 19. 12:46

84일차








--------------

프로세스

--------------



--- exit

프로세스를 정상적으로 종료시키는 함수.


#include <stdlib.h>


void exit(int status);


status : main 함수의 리턴값



리턴값

없음





--- atexit

프로그램을 정상적으로 종료할 때 실행될 함수를 등록한다.


#include <stdlib.h>


int atexit( void (*function)(void) );


function : 등록할 함수 이름으로 인수르 값는 함수



리턴값

성공시

0

실패시

-1




--- wait

자식 프로세스가 종료될 때까지 기다린다.


#include <sys/types.h>

#include <sys/wait.h>


pid_t wait(int *status);


status : 자식 프로세스가 종료될 때의 상태 정보.


status 4byte 중에 하위 2byte만 사용하는데

정상 종료시

하위 2byte 중 상위 1byte에 return 값, exit(값)이 들어가고

하위에는 0이 채워짐.


비정상 종료시

최하위 1byte에 프로세스를 종료시킨 시그널 번호가 저장된다.



리턴값

성공시

종료된 자식 프로세스의 프로세스 ID


실패시

-1








--- waitpid

(특정) 자식 프로세스가 종료될 때까지 기다린다.


#include <sys/types.h>

#include <sys/wait.h>


pid_t waitpid(pid_t pid, int *status, int options);


pid : 종료를 기다리는 자식 프로세스의 ID

-1을 주면 여러 자식중 하나라도 종료되기를 기다린다.

0을 주면 호출한 프로세스의 그룹 ID와 같은 그룹 ID를 가지는 자식 프로세스가 종료되기를 기다린다.

양수를 주면 그에 해당하는 자식 프로세스가 종료되기를 기다린다.


status : 자식 프로세스가 종료될 때의 상태 정보

options : 옵션

WNOHANG 옵션을 주면 자식이 종료되지 않더라도 부모 프로세스는 계속 실행한다.

0 옵션을 주면 wait과 동일하게 자식이 종료할 때가지 부모는 블록화된다.



리턴값

성공시

종료된 자식 PID


실패시

-1








--- 프로세스를 대체하는 함수들

하나의 프로세스가 실행 중에 이 함수를 사용하여 다른 프로세스를 실행시키면

다른 프로세스를 실행시키고 자신은 종료한다.


#include <unistd.h>


int execl( const char *path, const char *arg, ... , NULL);

int execlp( const char *file, const char *arg, ... , NULL);

int execle( const char *path, const char *arg , ... , char * const envp[]);

int execv( const char *path, char *const argv[]);

int execvp( const char *file, char *const argv[]);

int execve( const char *path, char *const argv[], char *const envp[]);


path : 실행될 파일의 경로와 이름

file : 실행될 파일 이름

arg : 실행될 인수들

argv : 실행 파일의 인수 배열

envp : 환경변수



리턴값

성공시

없음


실패시

-1



 1 #include <stdio.h>

 2 #include <unistd.h>

 3

 4 int main()

 5 {

 6     printf("Running ls with execl\n");

 7

 8     if(-1 == (execl("/bin/ls", "ls", "-al", NULL)))

 9     {

10         printf("error\n");

11         return 0;

12     }

13

14     printf("execl failed to run ls\n");

15

16     return 0;

17 }














--------------
함수 포인터
--------------




--- 인자로 함수를 받을 때


void test1 ( int (*fp)(const char *, ... ) )

{

fp("test\n");

}


         : 인자 데이터 타입

fp : 인자명






--- 리턴값을 함수로 할 때


int (* test2 (void) )(const char *, ... )

{

return printf;

}


         : 리턴 타입






--- 인자도 받고 리턴값도 함수


int (* test3 (int (*fp)(const char *, ... )) )(const char *, ...)

{

return fp;

}


         : 인자 데이터 타입

fp : 인자명

         : 리턴 타입






int main()

{

int (*fp)(const char *, ... );


test1(printf);


fp = test2;

fp("test2\n");


fp = test3(printf);

fp("test3\n");


return 0;

}