2016-08-11 7 views
0

다중 스레드 Linux/C++ 프로그램에서 fork()SIGCHLD의 신호 처리기를 사용하고 싶습니다.다중 스레드 프로그램 및 fork() : 대체 또는 안전한 구현

자식 프로세스에서 나는 open()을 사용하여 두 개의 새로운 파일 설명자인 sendfile()close()을 생성 한 다음 자식을 종료합니다.

나는 다음과 같은 요구 사항을 구현하기 위해 fork()를 사용 계획 : 자식 프로세스의 정상 종료를 감지

  1. 할 수 있어야한다 부모 프로세스에서

    스레드를, 그 경우에해야한다 다른 파일을 만들려면 fork()

  2. sendfile() 특정 이벤트가 발생할 경우 파일 처리 프로세스를 종료하고 의도적 인 종료 처리를 감지하여

요구 사항 1에 대해서는 단지 sendfile()의 결과를 기다릴 수 있습니다. 요구 사항 2는 내가 처음에 fork()을 사용해야한다고 생각하는 이유입니다.

다음 게시물

내 솔루션은 좋은하지 않을 수도 있다는 생각을 읽은 후.

내 질문은 : 요구 사항 2를 구현하는 다른 솔루션

  • 있습니까?
  • 또는 도서관에서 open(), close() and sendfile()이 제대로 호출되도록하려면 어떻게해야합니까?

업데이트 :

  • 는 내가 가장 효율적인 파일 전송을 가진위한 sendfile()를 사용한다고 가정 한 비지 박스 리눅스/ARM에서 실행되는 프로그램으로 인해 여러 게시물 I 이 주제에 관해 읽었습니다. 파일 전송이 2

업데이트 덜 효율적이 될 수 있다는 단점과, cpfork()exec*()를 사용하여이 될 수 내 요구 사항을 구현하는 안전한 방법 :

  • 그것의 충분한에 fork() 번 자식 프로세스에서 exec*()rsync으로 전환 한 이후 특정 이벤트가 발생했습니다 (파일 당 한 번이 아닌). 그러나 프로그램은 특정 이벤트의 경우 항상 rsync을 호출해야합니다.
+0

또는 포크 대신 백그라운드 스레드에서 읽기/쓰기를 사용하십시오. –

+0

다중 스레드 프로그램에서 fork 할 때 일반적으로 정의되지 않은 동작이 있습니다. 보다 구체적으로 말하면, 포크 된 자식은 비동기 신호 컨텍스트에 있으며 허용되는 작업은 (본질적으로) 종료 또는 exec입니다. 당신이 할 수있는 일은 메모리 할당과 같은 것입니다. –

+0

@RichardCritten :'sendfile()'이 돌아 오기를 기다리는 동안 bg 스레드에게 멈출 것을 알리는 방법이 없으며 거대한 파일이 처리 될 때 기다릴 필요가 없습니다. – radix

답변

3

스레드를 사용할 수 있지만 스레드를 강제 종료하면 일반적으로 메모리 누수 및 기타 문제가 발생합니다.

내 리눅스의 경험은 다소 제한적이지만 아마도 멀티 스레드되기 전에 일찍 프로그램을 포크하려고 시도 할 것입니다. 이제는 두 개의 인스턴스가 있으므로 단일 스레드 인스턴스를 사용하여 추가 인스턴스의 시작 및 중지를 안전하게 관리 할 수 ​​있습니다.

+0

아마도 개발 초기에 고려해 보면 솔루션 일 수 있지만 불행히도 제 경우에는 SW 디자인에 지대한 영향을 미칩니다. – radix

+0

나는 그것이 왜 그런지 더 설명해야한다고 생각합니다. 프로세스 간 통신을 위해 공유 메모리 등을 사용할 수 있다는 것을 알고 계십니까? 포크 된 인스턴스는 작업을 수행하는 데 필요한 데이터가 있어야합니다. 데이터 이외의 다른 리소스가 필요합니까? –

+0

하나의 문제는 "전송 스레드"가 오류를보고하기 위해 클래스 인스턴스에 대한 포인터를 수신한다는 것입니다. log 함수는 인스턴스가 주 스레드에서 실행되는 다른 클래스에서도 사용됩니다. 이것은 기본적으로 스레드의 나머지 구성과 마찬가지로 IPC를 통해 해결할 수 있습니다. 나는 더 간단한 해결책을 찾고 싶었다. – radix