로깅을 위해 파일에 표준 출력을 할당하는 기본 프로세스가 있는 상위 프로세스를 연다고 가정해 보겠습니다.
그런 다음 execvp(또는 다른 exec 계열 함수)를 통해 하위 프로세스를 열기 위해 상위 프로세스를 사용한다고 가정해 보겠습니다.
문서에 따르면,하위 프로세스는 상위 프로세스의 프로세스 ID를 유지합니다..
주요 문제:이는 하위 프로세스가 상위 프로세스의 파이프(특히 stdout 및 stderr)를 상속한다는 의미입니까?
답변1
답변2
예, exec를 사용하고 상위 프로세스와 동일한 pid를 상속한다는 것은 파일 설명자가 close-on-exec로 표시되지 않는 한 하위 프로세스가 기본적으로 파이프 연결을 유지한다는 것을 의미합니다(이는 다음을 통해 수행할 수 있습니다).포캉트르, Mark Plotnick의 답변 참조).
제가 질문을 썼을 때 실증적인 데이터로 답을 하려고 하다가 스스로 답을 하게 되어서 이렇게 했습니다.
파일에서 master.py
:
import subprocess
import logging
def main():
proc = ['python', 'parent.py']
logpath = 'parent.log'
with open(logpath, 'ab') as f:
p = subprocess.Popen(proc, stdout=f, stderr=subprocess.STDOUT)
logging.warn('task started, waiting to finish')
res = p.wait()
logging.warn(res)
if __name__ == '__main__':
main()
존재하다 parent.py
:
import os
import logging
def main():
proc = ['python', 'child.py']
logging.warn('parent is logging, pid: {0}'.format(os.getpid()))
os.execvp(proc[0], proc)
if __name__ == '__main__':
main()
그리고 child.py
:
import os
import logging
import time
def main():
for i in range(2):
logging.warn('child is logging, pid: {0}'.format(os.getpid()))
time.sleep(15)
if __name__ == '__main__':
main()
python master.py
명령줄에서 이것을 실행 하면 명령줄에 다음이 출력됩니다.
WARNING:root:task started, waiting to finish
약 15초 후:
WARNING:root:0
parent.log 파일에는 다음 내용이 포함되어 있습니다.
WARNING:root:parent is logging, pid 8515
WARNING:root:child is logging, pid 8515
WARNING:root:child is logging, pid 8515
이는 exec 함수 계열을 사용할 때 경험적으로 입증되었으며, 하위 프로세스는 상위 프로세스로부터 파이프와 pid를 상속합니다. 이에 대한 지원 문서를 찾기는 어렵지만 예가 있습니다.여기에 주어진(재료의 절반 정도.)