2012-08-01 3 views
0

나는 libev을 배우고있다. 그러나 ev_default_fork 플래그가 ev_loop 인 것에 대해 이해할 수 없습니다. 이것은 close-on-exec의 질문입니까? FD_CLOEXEC fcntl() 깃발처럼? 플래그를 설정해야합니까? 이 플래그는 어떤 경우에 필요합니까? 이 문서의 설명 :약 ev_default_fork에 관한 libev의 플래그

이 함수 하나가 백엔드 커널 상태를 재 초기화 이후 iterationsto ev_loop하게하는 플래그를 설정한다. 그럼에도 불구하고 언제든지 호출 할 수 있지만 하위 프로세스 (또는 자식 및 부모 모두)에서 분기하는 것이 가장 적합합니다. 단, 다시 은 점을 찍습니다. libev 함수가 중 하나를 사용하기 전에 자식에서 호출해야하며 다음 ev_loop 반복에서만 적용됩니다.

한편, 자식에서 이벤트 라이브러리를 사용하려는 경우에만 자식 프로세스에서이 함수를 호출하면됩니다. 그냥 exec + fork하면, 전혀 호출 할 필요가 없습니다.

함수 자체가 매우 빠르며 보통 후크의 경우에는 호출에 문제가 없습니다. 이것을 쉽게하기 위해, 함수는 pthread_atfork 호출에 inquite에 잘 맞을 것입니다 : pthread_atfork (0, 0, ev_default_fork);

답변

2

설명서를 읽었을 때 어린이의 기능을 fork() 다음에 호출하는 것이 가장 바람직합니다. 코드는 다음과 같아야합니다 :

switch (fork()) { 
case -1: 
    /* everything's gone pear-shaped */ 

default: 
    /* i am the parent */ 
    ... 
    break; 

case 0: 
    /* i am the child */ 
    ev_loop_fork(EV_DEFAULT); 
    ... 
    break; 
} 
+0

왜 내가 ev_default_fork()를 작성하지 않았습니까? – simon

+0

이 ev_default_fork()는 FD_CLOEXEC fcntl() 플래그처럼 작동합니까? – simon

+0

아니요, FD_CLOEXEC과 아무 관련이 없습니다. 'ev_default_fork()'는 내부 트릭을 수행하기 때문에 기본 ** loop **를 자식에서 사용할 수 있습니다. 그 말은 부모와 함께 등록 된 모든 사건이 그 아이와 계속해서 일한다는 것을 의미합니다. 그렇게하지 않으면 기본 루프가 해당 큐에서 사용할 수없는 이벤트를 갖습니다. – hroptatyr