"waitpid를 호출한 영역에서 일시 중지 된다." - 호출한 영역? 이 정확히 무엇인가요?
글쓴이: 익명 사용자 / 작성시간: 월, 2018/10/08 - 3:28오후
waitpid 설명을 읽어보면
"waitpid 함수는 인수로 주어진 pid 번호의 자식프로세스가 종료되거나, 시그널 함수를 호출하는 신호가 전달될때까지 waitpid 호출한 영역에서 일시 중지 된다."
이라고 나와있습니다. 호출한 영역에서 일시 중지 된다는 것은 그 호출한 스레드가 일시 중지 된다는 것인가요?
아니면 현재 프로세스가 멈춘다는 것인가요?
실험해 본결과
#include <iostream> #include <thread> #include <unistd.h> #include <condition_variable> #include <sys/wait.h> using namespace std; int main() { // 제 3자 스레드 auto T3 = thread([]() { while (true) { cout << "T3 thread \n"; } }); auto A = thread([]() { int pid = fork(); if (pid == 0) { for (int i = 0; i < 100; ++i) { cout << "A thread - Child \n"; } exit(0); } int state; waitpid(pid, &state, 0); }); A.join(); T3.join(); return 0; }
T3 thread
A thread - Child 가 왔다갔다하면서 호출한 스레드가 블러킹 되는 것을 확인 할 수 있었습니다.
그렇다면 호출한 영역에서 멈춘다는 말은 스레드 기준인가요?
지금 제가 설계하는 것이
T1, T2, 스레드가 있다면
T1에서 fork-exec 조합으로 외부 프로그램을 실행하고
T2에게 작업 결과를 넘기는 프로그램을 작성하고 있습니다.
스레드에서 fork-exec 조합을 사용하는것이 괜찮을지 궁금합니다.
fork 현재 프로세스를 복사하는 것인데 혹시 다른 방법이 있는지 궁금합니다.
긴 글 읽어주셔서 감사합니다.
Forums:
참고해보세요.
- waitpid() 인자값 / 리턴값 / 오류값을 확인해보세요. ㅇ_ㅇ;;
자식 프로세스를 기다린다고 적혀 있습니다.
- 시그널 설정에 따라서. 다른 형식에 사용도 가능해 보입니다.
- 잘 되는 책 예제 / 소스 / 설명 + 사이트 / 블로그 등을 참고해보세요. ㅇ_ㅇ;;
- 대충 해보니.
자식 종료시 waitpid() 함수를 넘어갑니다.
sigaction() 사용시. 콜백함수에서 특정 프로세스가 종료된 상황을 알 수 있을것 같습니다.
뿐만 아니라. sigaction() 사용시. pid == 0 가 되기도 했습니다. ㅇ_ㅇ;;
이것저것 해보셔야 할것 같습니다.
//
waitpid 함수 사용하기(wait함수와 비교)
http://codetravel.tistory.com/42
//
waitpid - 네이버 책
https://book.naver.com/search/search.nhn?sm=sta_hty.book&sug=&where=nexearch&query=waitpid
//
리눅스 AIO 사용 문의
https://kldp.org/node/160178
다중쓰레드가 돌고있는 프로세스를 포크시키면 어떻게 될까..
https://kldp.org/node/27109
리눅스 시스템콜 fork() 소스는 어떻게 알수있죠?
https://kldp.org/node/160148
Server 에서 왜 fork()를 사용하나요?
https://kldp.org/node/32210
fork()와 exec() 개념 좀 설명해주세요.
https://kldp.org/node/545
fork로 메시지 보내기
https://docs.google.com/presentation/d/1Ft6R7uirfA4A8Vr60o1ETHyMaoTEMz8DcjUoOalXAdU/edit?usp=sharing
//
waitpid 자식 프로세스 종료 확인
http://forum.falinux.com/zbxe/index.php?mid=C_LIB&document_srl=408548
http://downman.tistory.com/123
waitpid(2) - Linux man page
https://linux.die.net/man/2/waitpid
sigaction(2) - Linux man page
https://linux.die.net/man/2/sigaction
mprotect(2) - Linux man page
https://linux.die.net/man/2/mprotect
1장. waitpid(2)
https://www.joinc.co.kr/w/man/2/waitpid
https://en.cppreference.com/w/cpp/language/cv
http://voyager.deanza.edu/~perry/sigchld.html
cleaning child processes with handler with waitpid pselect fork sigaction
https://stackoverflow.com/questions/25339266/cleaning-child-processes-with-handler-with-waitpid-pselect-fork-sigaction
http://smeffect.tistory.com/entry/03-fork-좀비프로세스
Reap zombie processes using a SIGCHLD handler
http://www.microhowto.info/howto/reap_zombie_processes_using_a_sigchld_handler.html
[C] Zombie process 처리
https://reachlabkr.wordpress.com/2014/06/22/c-zombie-process-처리/
Advanced Programming in the UNIX Environment: Advanc Progra UNIX Envir_p3
https://books.google.co.kr/books?id=kCTMFpEcIOwC&pg=PA370&lpg=PA370&dq=sigaction+waitpid&source=bl&ots=zwGD_QVwsC&sig=fqrJ97YaCqDkuix2wqv4UtuVKQk&hl=ko&sa=X&ved=2ahUKEwizx_fyp_bdAhWsHjQIHRpxBDwQ6AEwD3oECAMQAQ#v=onepage&q=sigaction%20waitpid&f=false
wait, waitpid, wait3, or wait364 Subroutine
https://www.ibm.com/support/knowledgecenter/sv/ssw_aix_72/com.ibm.aix.basetrf2/wait_waitpid_wait3_wait364.htm
Waits for a child process to stop or end.
SIGCHLD handler
https://www.linuxprogrammingblog.com/code-examples/SIGCHLD-handler
wait, waitpid - wait for a child process to stop or terminate
http://pubs.opengroup.org/onlinepubs/9699919799/functions/wait.html
Sighandler doesn,t work
http://www.cplusplus.com/forum/unices/119398/
: WIFSIGNALED (status)
https://octave.sourceforge.io/octave/function/WIFSIGNALED.html
Test cases in C for WIFSIGNALED, WIFSTOPPED, WIFCONTINUED
https://stackoverflow.com/questions/907867/test-cases-in-c-for-wifsignaled-wifstopped-wifcontinued
WIFSIGNALED–Query status to see if a child process ended abnormally
https://www.ibm.com/support/knowledgecenter/en/SSB23S_1.1.0.15/gtpc2/cpp_wifsignaled.html
wait–Wait for status information from a Child process
https://www.ibm.com/support/knowledgecenter/SSB23S_1.1.0.15/gtpc2/cpp_wait.html#cpp_wait
sigaction–Examine and change signal action
https://www.ibm.com/support/knowledgecenter/SSB23S_1.1.0.15/gtpc2/cpp_sigaction.html
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
...
한글로 번역된 매뉴얼이 무슨 말인지 이해가 안될 때는 영문판을 찾아보는 게 좋습니다.
안타깝지만 현실입니다. 한글로 제대로 된 번역이 될 때까지 기다릴 시간에 그냥 영어 독해력을 기르는 편이 빠릅니다.
정확히 대응되는 영문판이 뭔지는 모르겠지만 구글에 "man waitpid"를 쳐보면 여러 가지 페이지가 나오는데 대략 대응되는 구절은 다음과 같습니다:
> The waitpid() system call suspends execution of the calling process until a child specified by pid argument has changed state.
그러니까 pid로 가리키는 자식 프로세스의 상태가 바뀔 때까지 waitpid를 부른 프로세스가 동작을 중단하고 기다린다는 이야기지요.
* 아 근데 매뉴얼에 자세히 나와있지는 않은데 -_- 이런 건 특별한 말이 없는 한 보통 다 thread 기준입니다. 그러니까 multithreading 환경에서 한 쓰레드가 waitpid를 불렀다면 다른 쓰레드는 상관없이 계속 진행중이라고 생각하시면 됩니다.
모두 정말 감사합니다.
감사합니다^^
댓글 달기