"waitpid를 호출한 영역에서 일시 중지 된다." - 호출한 영역? 이 정확히 무엇인가요?

익명 사용자의 이미지

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 현재 프로세스를 복사하는 것인데 혹시 다른 방법이 있는지 궁금합니다.

긴 글 읽어주셔서 감사합니다.

shint의 이미지


- 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

jick의 이미지

한글로 번역된 매뉴얼이 무슨 말인지 이해가 안될 때는 영문판을 찾아보는 게 좋습니다.

안타깝지만 현실입니다. 한글로 제대로 된 번역이 될 때까지 기다릴 시간에 그냥 영어 독해력을 기르는 편이 빠릅니다.

정확히 대응되는 영문판이 뭔지는 모르겠지만 구글에 "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를 불렀다면 다른 쓰레드는 상관없이 계속 진행중이라고 생각하시면 됩니다.

글쓴이의 이미지

감사합니다^^

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.