20140619 - 프로세스, 함수 포인터

네트워크 2014. 6. 19. 13:57 Posted by Owen.K



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

프로세스

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



--- 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

#include <stdio.h>

#include <unistd.h>

int main()

{

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


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

     {

         printf("error\n");

         return 0;

     }

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

     return 0;

 }

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

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

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

{

fp("test\n");

}


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

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

{

return printf;

}


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

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

{

return fp;

}

int main()

{

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


test1(printf);


fp = test2;

fp("test2\n");


fp = test3(printf);

fp("test3\n");


return 0;

}


 

 

 

프로세스 종료하기


exit 함수

프로세스가 정상적으로 종료된다. status의 하위 8비트는 main 함수의 반환값이 된다. 그 반환값을

보고 어떠한 상태로 종료되었는지를 알 수 있게 된다.

기능

정상적으로 프로세스를 종료한다.

기본형

void exit(int status);

status : main 함수의 반환값

반환값

없음

헤더 파일

<stdlib.h>







#include <stdio.h>

#include <sys/types.h>

#include <unistd.h>

int main()

{

      pid_t pid;

if((pid=fork())==-1)

{   /*fork 호출에 실패하면 1을 반환하고 종료*/

      perror("fork failed");

     exit(1);

}

else if(pid != 0)

{   /*부모 프로세스는 2를 반환하고 종료*/

printf("parent process\n");

      exit(2);

}

else

{   /*자식 프로세스는 3을 반환하고 종료*/

         printf("child process\n");

         exit(3);

}

return 0;

}



atexit 함수

exit 함수가 호출되거나 main 함수로부터 리턴될 때 실행될 함수를 등록하는 함수로, exit 호출을

하면 atexit에 의해 등록된 함수가 실행된다. 만약 등록된 함수가 여러 개일 경우 최근에 등록된

함수순으로 실행되고 인수에 함수 이름을 위치한다.

기능

exit 호출 때 실행될 함수를 등록한다.

기본형

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

function : 등록할 함수 이름으로 인수가 없는 함수

반환값

성공 : 0

실패 : -1

헤더 파일

<stdlib.h>




      1 #include <stdio.h>

      2 #include <stdlib.h>

      3

      4 void func1(void);

      5 void func2(void);

      6 void func3(void);

      7

      8 int main()

      9 {

     10     /*exit 함수 호출 때 실행될 함수를 func1,func2,func3 순으로 등록*/

     11     atexit(func1);

     12     atexit(func2);

     13     atexit(func3);

     14

     15     exit(0);

     16     return 0;

     17 }

     18

     19 void func1(void)

     20 {

     21     printf("run function1\n");

     22 }

     23

     24 void func2(void)

     25 {

     26     printf("run function2\n");

     27 }

     28

     29 void func3(void)

     30 {

     31     printf("run function3\n");

     32 }





abort에 의해 비정상적으로 종료될 때 atexit에 의해 등록된 함수가 실행되지 않음을 보여줄 것이다.

argv[1]이 0이면 if조건이 참이 되어 abort에 의해 비정상적으로 종료되어 atexit에 의해 동록된 함수가

실행되지 않는다.




      1 #include <stdio.h>

      2 #include <stdlib.h>

      3

      4 void func(void);

      5

      6 int main(int argc, char *argv[])

      7 {

      8     atexit(func);

      9     /*atoi는 정수 형태의 문자열을 정수로 변환하는 함수로 argv[1]이

     10      * 1이면 1로 변환. argv[1]이 0이 되어야 if 조건이 참이 됨.*/

     11     if(!atoi(argv[1]))

     12     {   /*비정상적으로 프로세스를 종료하는데 atexit에 의해 등록된

     13          함수는 실행되지 않음.*/

     14         abort();

     15         exit(0);

     16         /*정상적으로 프로세스를 종료하는데 atexit에 의해 등록된

     17          * 함수가 실행됨.*/

     18     }

     19     return 0;

     20 }

     21

     22 void func(void)

     23 {

     24     printf("run function\n");

     25 }



프로세스 종료를 기다림


wait 함수 

자식 프로세스가 종료될 때까지 아무 일도 하지 않고 기다리는 함수.

기능

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

기본형

pid_t wait(int *status);

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

반환값

성공 : 종료된 자식 프로세스의 프로세스 ID

실패 : -1

헤더 파일

<sys/types.h>

<sys/wait.h>


status에는 자식 프로세스가 종료될 때의 상태 정보가 저장되는데, 자식 프로세스가 정상적으로 

종료되면 status의 하위 8비트에는 0이 저장되고 상위 8비트에는 exit(번호)의 '번호'가 저장된다.


비정상적으로 종료되면 status의 우측 8비트에 프로세스를 종료시킨 시그널의 번호가 저장된다.





함수이름 test