waitpid 함수를 실행시킨 후,
waitpid 가 child process 의 상태를 반환할 때, 사용하는
WIFSTOPPED 와 WIFCONTINUED 의 기능을 어떻게 확인해 볼 수 있을까 궁금해졌는데,
waitpid(pid, &status, WUNTRACED | WCONTINUED) 와 같이
WUNTRACED 와 WCONTINUED 를 같이 설정해 주면 되네.
man wait 의 실행 페이지를 보니까
설명이 잘 되어 있다.
$ ./a.out &
Child PID is 32360
[1] 32359
$ kill -STOP 32360
stopped by signal 19
$ kill -CONT 32360
continued
$ kill -TERM 32360
killed by signal 15
| 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 
33 
34 
35 
36 
37 
38 
39 
40 
41 
42 
43 
44 
45 
46 
47 
48 
49 
50 
51 
52 
53 
54 
55 
56 
57 
58 
59 
60 
61 
62 
63 
64 
65 
66 
67 
68 
69 
70 
71 
72 
73 
74 
75 
76 
77 
78 
79 
80 
81 
82 
83 
84 
85 
86 
87 
88 | 
#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/wait.h> 
#include <string.h> 
#include <errno.h> 
void error_handling( char * msg ); 
int main(int argc, char * argv[] ) 
{ 
    int status; 
    pid_t pid; 
    int i; 
    if( ( pid = fork() ) < 0 ) 
    { 
        error_handling( "fork() fail!" ); 
    } 
    else if( pid == 0 ) // child 
    { 
        int j; 
        printf("child self print : %d\n", getpid() ); 
        for( j=0; j < 100; j++ ) 
        { 
            printf("child : %d\n", j ); 
            sleep(2); 
            //status = status / 0; 
            //abort(); 
            //pause(); 
        } 
        return 3; 
    } 
    else 
    { 
        printf( "child PID : %d\n", pid ); 
        do 
        { 
            if( waitpid(pid, &status, WUNTRACED | WCONTINUED)  != pid ) 
            { 
                error_handling("wait() failed!"); 
            } 
            if( WIFEXITED( status ) ) 
            { 
                printf("child normal   termination : %d\n", WEXITSTATUS( status ) ); 
            } 
            else if( WIFSIGNALED( status ) ) 
            { 
                printf("child abnormal termination : %d, msg : '%s'\n", 
                        WTERMSIG( status ), 
                        strsignal( WTERMSIG( status ) ) 
                    ); 
            } 
            else if( WIFSTOPPED( status ) ) 
            { 
                printf("child stop : %d\n", WSTOPSIG( status ) ); 
            } 
            else if( WIFCONTINUED( status ) ) 
            { 
                printf("child continue\n" ); 
            } 
        }while( !WIFEXITED(status) && !WIFSIGNALED(status) ); 
    } 
    return 0; 
} 
void error_handling( char * msg ) 
{ 
    fputs( msg, stderr ); 
    putc('\n', stderr ); 
    fprintf(stderr, "error number  : %d\n", errno ); 
    fprintf(stderr, "error message : %s\n", strerror( errno ) ); 
    exit(1); 
} | cs | 
