exec 함수 계열 중 하나를 사용하여 하위 프로세스를 열면 상위 프로세스에 대한 파이프가 하위 프로세스에 적용됩니까?

exec 함수 계열 중 하나를 사용하여 하위 프로세스를 열면 상위 프로세스에 대한 파이프가 하위 프로세스에 적용됩니까?

로깅을 위해 파일에 표준 출력을 할당하는 기본 프로세스가 있는 상위 프로세스를 연다고 가정해 보겠습니다.

그런 다음 execvp(또는 다른 exec 계열 함수)를 통해 하위 프로세스를 열기 위해 상위 프로세스를 사용한다고 가정해 보겠습니다.

문서에 따르면,하위 프로세스는 상위 프로세스의 프로세스 ID를 유지합니다..

주요 문제:이는 하위 프로세스가 상위 프로세스의 파이프(특히 stdout 및 stderr)를 상속한다는 의미입니까?

답변1

문서화된 답변을 얻으려면 exec 함수 호출 계열의 시스템 호출에 대한 매뉴얼 페이지를 살펴봐야 합니다.구현하다:

기본적으로 파일 설명자는 execve() 중에 열려 있습니다. close-on-exec로 표시된 파일 설명자는 FD_CLOEXEC의 설명을 참조하세요.FCNTL(2).

따라서 프로세스가 파이프의 파일 설명자에 close-on-exec 플래그를 설정하지 않으면 실행 후에도 열린 상태로 유지됩니다.

답변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를 상속합니다. 이에 대한 지원 문서를 찾기는 어렵지만 예가 있습니다.여기에 주어진(재료의 절반 정도.)

관련 정보