-
20140619 (프로세스, 함수 포인터)부산IT학원/스마트컨트롤러 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;
}
'부산IT학원 > 스마트컨트롤러' 카테고리의 다른 글
20140623 (pthread, 레코드 잠금) (0) 2014.06.23 20140620 (시그널, 멀티쓰레드) (0) 2014.06.20 20140618 (3 Hand shake, 4 way Hand shake, 프로세스) (0) 2014.06.18 20140616 (TCP/IP client, server 소스) (0) 2014.06.16 20140613 (TCP/IP) (0) 2014.06.13