2014-02-08 3 views
1

Unix에서 fork()를 호출 한 후 신호 마스크를 재설정하고 자식이 갖고 싶지 않은 파일 설명자를 닫아야한다는 것을 알고 있습니다. exec()를 호출합니다.exec 전 fork 전의 모든 cleanup 단계에 관한 공식 문서.

하지만 그 밖의 무엇을해야합니까?

좋은 표준 실행 환경을 제공하기 위해 하위 프로세스를 포크 할 때 정리해야 할 모든 것을 나열하는 포괄적 인 문서가 있습니까?

저는 현재 리눅스에 있지만 다른 유닉스에 대한 세부 정보가 포함 된 문서를 원하고 있습니다. 가능하면 자동 구성 테스트를 할 수있는 방법이 있습니다.

답변

0

fork(3)comprehensive list을 제공합니다. 여기에 인용하는 데 약간 시간이 걸리지 만 SO 정책에 따라 어쨌든 그렇게 할 것입니다 :

fork() 함수는 새로운 프로세스를 생성해야합니다. 새로운 프로세스 (아이 프로세스)는 아래에 설명 된 경우를 제외하고 호출 프로세스 (부모 과정)의 정확한 복사본한다 :

  • 자식 프로세스는 고유 한 프로세스 ID를 가져야한다.
  • 하위 프로세스 ID도 활성 프로세스 그룹 ID와 일치하지 않아야합니다.
  • 하위 프로세스는 다른 상위 프로세스 ID를 가져야하며, 이는 호출 프로세스의 프로세스 ID입니다.
  • 하위 프로세스는 상위 파일 기술자의 자체 복사본을 가져야합니다. 각 하위 파일 설명자는 동일한 열린 파일 설명과 해당 파일 설명자인 부모를 나타냅니다.
  • 하위 프로세스에는 부모의 열린 디렉토리 스트림 사본이 있어야합니다. 자식 프로세스의 각각의 열린 디렉토리 스트림은 디렉토리 스트림을 상위 디렉토리의 스트림과 공유 할 수 있습니다.
  • 하위 프로세스에는 상위 메시지 카탈로그 설명자의 자체 복사본이 있어야합니다.
  • 자식 프로세스의 tms_utime과, tms_stime, tms_cutime의 값과 tms_cstime의 알람 클럭까지 남아 0
  • 시간으로 설정된다는 0으로 리셋 될 것이며, 알람이있는 경우, 취소되어야 ; alarm()을 참조하십시오.
  • 모든 semadj 값을 지워야합니다.
  • 상위 프로세스가 설정 한 파일 잠금은 하위 프로세스에 상속되지 않습니다.
  • 하위 프로세스에 대해 보류중인 신호 세트는 빈 세트로 초기화되어야한다.
  • 간격 타이머는 하위 프로세스에서 재설정되어야합니다.
  • 부모 프로세스에서 열려있는 모든 세마포는 하위 프로세스에서도 열려 있어야합니다.
  • 자식 프로세스는 mlockall() 또는 mlock() 호출을 통해 부모 프로세스에 의해 설정된 주소 공간 메모리 잠금을 상속하지 않습니다.
  • 부모에서 생성 된 메모리 매핑은 자식 프로세스에서 유지되어야합니다.부모로부터 계승 된 MAP_PRIVATE 매핑은 자식의 MAP_PRIVATE 매핑이되어야하며, fork()를 호출하기 전에 부모가 만든 이러한 매핑의 데이터 수정은 이되어야합니다. fork()가 반환 된 후 MAP_PRIVATE 부모가 만든 매핑의 데이터를 수정하면 부모에게만 만 표시됩니다. MAP_PRIVATE 매핑에서 데이터에 대한 수정은 자식에 의해 으로 만 이루어져야한다.
  • SCHED_FIFO 및 SCHED_RR 예약 정책의 경우 하위 프로세스는 fork() 기능을 수행하는 동안 상위 프로세스의 정책 및 우선 순위 설정을 상속합니다. 다른 스케줄 정책의 경우, 정책 및 fork()의 ​​우선 순위 설정은 구현에 따라 정의됩니다.
  • 상위 프로세스에 의해 생성 된 프로세스 별 타이머는 하위 프로세스에 상속되지 않습니다.
  • 하위 프로세스는 부모의 메시지 큐 디스크립터의 자체 복사본을 가져야합니다. 자식의 메시지 설명자는 각각 부모의 해당 메시지 설명자 과 동일한 열린 메시지 대기열 설명을 참조해야합니다.
  • 비동기 입력 또는 비동기 출력 작업은 하위 프로세스에 의해 상속되지 않습니다.
  • 프로세스는 단일 스레드로 작성되어야합니다. 다중 스레드 프로세스가 fork()를 호출하면 새로운 프로세스는 호출 스레드 및 해당 전체 주소 공간의 복제본을 포함해야하며 가능하면 개의 뮤텍스 및 기타 자원 상태를 포함해야합니다. 따라서 오류를 피하기 위해 자식 프로세스는 exec 함수 중 하나가 호출 될 때까지 까지 async-signal-safe 작업 만 실행할 수 있습니다. 포크 핸들러는 일 수 있으며, 은 fork() 호출에서 애플리케이션 불변 조건을 유지하기 위해 pthread_atfork() 함수를 사용하여 설정할 수 있습니다. 응용 프로그램이 신호 처리기에서 fork()를 호출하고 pthread_atfork()에 의해 등록 된 fork 핸들러 중 하나가 비동기 신호가 아닌 함수를 호출하면 동작이 정의되지 않습니다.
  • Trace 옵션과 Trace Inherit 옵션이 모두 지원되는 경우 : 호출 프로세스가 상속 정책이 POSIX_TRACE_INHERITED로 설정된 추적 스트림에서 추적되는 경우 자식 프로세스 은 해당 추적 스트림으로 추적되어야하며 하위 프로세스는 이벤트 유형 식별자를 추적하도록 추적 이벤트 이름의 상위 맵핑을 상속해야합니다. 호출 프로세스가 인 추적 스트림이 상속 정책이 POSIX_TRACE_CLOSE_FOR_CHILD로 설정된 경우 하위 프로세스는 해당 추적 스트림으로 으로 추적되어서는 안됩니다. 상속 정책은 posix_trace_attr_setinherited() 함수를 호출하여 설정됩니다.
  • 추적 옵션이 지원되지만 추적 상속 옵션이 지원되지 않는 경우 하위 프로세스는 상위 프로세스의 추적 스트림 중 하나에 추적되지 않습니다.
  • 추적 옵션이 지원되는 경우 추적 컨트롤러 프로세스의 하위 프로세스는 상위 프로세스로 제어되는 추적 스트림을 제어해서는 안됩니다.
  • 자식 프로세스의 CPU 시간 클럭의 초기 값은 0으로 설정되어야한다.
  • 하위 프로세스의 단일 스레드의 CPU 시간 클럭의 초기 값은 0으로 설정해야합니다. IEEE Std 1003.1-2001에 정의 된 다른 모든 프로세스 특성 은 부모 프로세스와 자식 프로세스 과 동일해야합니다.IEEE Std 1003.1-2001에 정의 된 이 아닌 프로세스 특성의 상속은 IEEE Std 1003.1-2001에 의해 지정되지 않습니다.
+0

여기에는 ** ** 걱정하지 않아도되는 모든 내용이 나와 있습니다. 예를 들어, 신호 마스크에 대해서는 아무 것도 말하지 않습니다. 왜냐하면 신호 마스크는 스스로 정리해야하기 때문입니다. 포크()도 exec()도 신경 쓰지 않는 목록을 찾고 있습니다. – dataless

+0

흠, 당신은 부분적으로 맞습니다. 파일 디스크립터, 디렉토리 스트림 및 메시지 대기열 디스크립터에 대해 걱정할 수있는 잠재적 인 사항을 언급합니다. – Thomas