Wait Macros
Can I find out the exit value of my child?
Wait macro를 통해 child의 exit value(main의 리턴값이나 exit()안에 포함된 값)의 LSB 8 비트를 통해 알수 있습니다. 이 Wait macro는 주로 WIFEXTED와 WEXITSTATUS와 같이 사용합니다. 더 자세한 사항은 wait이나 waitpid의 man page를 참고합시다.
int status; pid_t child = fork(); if (child == -1) return 1; // Failed if (child > 0) { /* I am the parent - wait for the child to finish */ pid_t pid = waitpid(child, &status, 0); if (pid != -1 && WIFEXITED(status)) { int low8bits = WEXITSTATUS(status); printf("Process %d returned %d" , pid, low8bits); } } else { /* I am the child */ // do something interesting execl("/bin/ls", "/bin/ls", ".", (char *) NULL); // "ls ." }
프로세스는 256개만의 리턴값을 가지고 있고, 나머지 비트는 정보를 저장하기 위해 사용됩니다.
Bit Shifting
다음에 설명할 내용을 기억할 필요는 없습니다. 다음은 status variable 안의 정보가 어떻게 저장되는지에 대한 설명입니다.
/* If WIFEXITED(STATUS), the low-order 8 bits of the status. */ #define __WEXITSTATUS(status) (((status) & 0xff00) >> 8) /* If WIFSIGNALED(STATUS), the terminating signal. */ #define __WTERMSIG(status) ((status) & 0x7f) /* If WIFSTOPPED(STATUS), the signal that stopped the child. */ #define __WSTOPSIG(status) __WEXITSTATUS(status) /* Nonzero if STATUS indicates normal termination. */ #define __WIFEXITED(status) (__WTERMSIG(status) == 0)
위는 안드로이드 소스 코드입니다. 커널은 시그널을 받았는지, 종료되었는지, 정지했는지에 대한 정보를 얻는 내부적인 방법을 가지고 있습니다. 이러한 API는 추상적으로 정의되어 있어 커널 개발자들은 자유롭게 바꿀 수 있습니다.
Being careful
전제조건이 맞아야만 macro를 사용할 수 있다는 것을 기억하십시오. 즉, 프로세스의 exit status는 프로세스가 signaled 되었을 때 정의되지 않습니다.
Macros는 프로그래머를 위해 체크해주지 않으므로 로직을 확인하는 것은 프로그래밍에 달렸습니다.
'Angrave System Programming > Processes' 카테고리의 다른 글
Processes Review Questions (0) | 2019.01.18 |
---|---|
Process Control : Signals (0) | 2019.01.11 |
Forking: Fork, Exec, Wait(2) (0) | 2019.01.11 |
Forking: Fork, Exec, Wait(1) (0) | 2019.01.11 |
Forking Introduction (0) | 2019.01.10 |