fork() 브랜치가 예상보다 많습니까?
다음 코드를 고려합니다.
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main(void)
{
int i;
for(i = 0; i < 2; i++)
{
fork();
printf(".");
}
return 0;
}
이 프로그램은 8개의 도트를 출력합니다.그게 어떻게 가능하죠?대신 6개의 점이 있어야 하지 않나요?
그fork()
원시적인 것은 종종 상상력을 확장시킨다.감을 잡을 때까지 각 작업이 무엇인지 추적하고 프로세스 수를 고려해야 합니다.fork()는 현재 프로세스의 거의 완벽한 복사본을 만듭니다.(대부분의 경우) 가장 큰 차이는 다음과 같습니다.fork()
의 반환값은 부모 및 자녀에 따라 다릅니다.(이 코드는 반환값을 무시하므로 차이가 없습니다.)
그래서 처음에는 한 가지 과정이 있습니다.그러면 두 번째 프로세스가 생성되고 두 번째 프로세스는 모두 점과 루프를 인쇄합니다.두 번째 반복 시 각각 다른 복사본이 생성되므로 4개의 프로세스가 점을 인쇄한 후 종료합니다.예상대로 6개의 점을 쉽게 설명할 수 있습니다.
하지만, 뭐?printf()
실제로는 출력을 버퍼링합니다.따라서 2개의 프로세스만 있었을 때의 첫 번째 점은 작성 시 표시되지 않습니다.이러한 도트는 버퍼에 남습니다.이것은 fork()로 복제됩니다.프로세스가 종료될 때까지 버퍼링된 점이 표시되지 않습니다.버퍼링된 도트를 인쇄하는 4가지 프로세스와 새로운 도트를 더하면 8개의 도트를 얻을 수 있습니다.
이 동작을 피하고 싶다면fflush(stdout);
끝나고printf()
.
출력 스트림에 커밋되지 않은 버퍼가 있습니다.stdout은 회선으로 제어되며 버퍼는 나머지 프로세스와 함께 복제됩니다.프로그램이 종료되면 커밋되지 않은 버퍼가 2회(프로세스별로 1회) 작성됩니다.둘 다 사용
printf("a\n");
그리고.
printf("a "); fflush(stdout);
문제를 드러내지 마세요.
첫 번째 예에서는 출력 스트림버퍼에 각각2개의 점이 있는4개의 프로세스를 만듭니다.각 스트림은 종료되면 버퍼를 플러시하여 8개의 도트를 생성합니다.
i=0인 경우
프로세스_1: 버퍼링된 텍스트= 1 도트
Process_2(Process_1에 의해 작성):버퍼링된 텍스트 = 도트 1개
i=1일 때
Process_3(Process_1에 의해 작성):Process_1에서 버퍼링된 도트 1개를 상속하고 도트 1개를 인쇄합니다.전체 프로세스_3은 2개의 점을 인쇄합니다.
Process_4(Process_2에 의해 작성):Process_2에서 버퍼링된 도트 1개를 상속하고 도트 1개를 인쇄합니다.전체 프로세스_4는 2개의 점을 인쇄합니다.
프로세스_1 : 2개의 도트를 인쇄합니다(i=0일 때 버퍼링된 도트 1개와 i=1일 때 다른 도트 1개).
프로세스_2 : 2개의 도트를 인쇄합니다(i=0일 때 버퍼링된 도트 하나, i=1일 때 다른 도트 하나).
최종 출력: 8 도트.:)
언급URL : https://stackoverflow.com/questions/11132868/fork-branches-more-than-expected
'programing' 카테고리의 다른 글
C로 구분하는 문자열 분할 (0) | 2022.07.11 |
---|---|
vuex에 중요한 정보 저장 (0) | 2022.07.11 |
부팅 시 지정된 브라우저 URL로 리디렉션 (0) | 2022.07.11 |
봄 MVC: 검증 실행 방법 (0) | 2022.07.06 |
vuejs2/vuex: 돌연변이에 대한 다중 구독을 방지하는 방법 (0) | 2022.07.06 |