다중 스레드 Linux/C++ 프로그램에서 fork()
에 SIGCHLD
의 신호 처리기를 사용하고 싶습니다.다중 스레드 프로그램 및 fork() : 대체 또는 안전한 구현
자식 프로세스에서 나는 open()
을 사용하여 두 개의 새로운 파일 설명자인 sendfile()
과 close()
을 생성 한 다음 자식을 종료합니다.
fork()
를 사용 계획 : 자식 프로세스의 정상 종료를 감지
- 할 수 있어야한다 부모 프로세스에서
스레드를, 그 경우에해야한다 다른 파일을 만들려면
fork()
sendfile()
특정 이벤트가 발생할 경우 파일 처리 프로세스를 종료하고 의도적 인 종료 처리를 감지하여
요구 사항 1에 대해서는 단지 sendfile()
의 결과를 기다릴 수 있습니다. 요구 사항 2는 내가 처음에 fork()
을 사용해야한다고 생각하는 이유입니다.
내 솔루션은 좋은하지 않을 수도 있다는 생각을 읽은 후.
내 질문은 : 요구 사항 2를 구현하는 다른 솔루션
- 있습니까?
- 또는 도서관에서
open(), close() and sendfile()
이 제대로 호출되도록하려면 어떻게해야합니까?
업데이트 :
- 는 내가 가장 효율적인 파일 전송을 가진위한
sendfile()
를 사용한다고 가정 한 비지 박스 리눅스/ARM에서 실행되는 프로그램으로 인해 여러 게시물 I 이 주제에 관해 읽었습니다. 파일 전송이 2
업데이트 덜 효율적이 될 수 있다는 단점과, cp
와 fork()
및 exec*()
를 사용하여이 될 수 내 요구 사항을 구현하는 안전한 방법 :
- 그것의 충분한에
fork()
번 자식 프로세스에서exec*()
과rsync
으로 전환 한 이후 특정 이벤트가 발생했습니다 (파일 당 한 번이 아닌). 그러나 프로그램은 특정 이벤트의 경우 항상rsync
을 호출해야합니다.
또는 포크 대신 백그라운드 스레드에서 읽기/쓰기를 사용하십시오. –
다중 스레드 프로그램에서 fork 할 때 일반적으로 정의되지 않은 동작이 있습니다. 보다 구체적으로 말하면, 포크 된 자식은 비동기 신호 컨텍스트에 있으며 허용되는 작업은 (본질적으로) 종료 또는 exec입니다. 당신이 할 수있는 일은 메모리 할당과 같은 것입니다. –
@RichardCritten :'sendfile()'이 돌아 오기를 기다리는 동안 bg 스레드에게 멈출 것을 알리는 방법이 없으며 거대한 파일이 처리 될 때 기다릴 필요가 없습니다. – radix