fork()에서 발생하는 문제

forhopes의 이미지


제가 fork()를 가지고 프로그래밍중에 있습니다.

if ( 0x0 == fork() )
{
printf("1\n");
for (;;) sleep(1);
}

printf("2\n);

이런 식으로 프로그래밍을 짰는데,

"1"은 출력되는데, 2는 출력 안 됩니다.

child는 동작하고 있는데, parent가 어디에선가 홀딩되어 있는 상태인가요 ?

어떤 경우 이런 증상이 나타나나요 ? 커널, 라이브러리 어느쪽이 문제일까요 ??

kknd345의 이미지

#include
#include

int main()
{

if ( 0x0 == fork() )
{
printf("1\n");
for (;;) sleep(1);
}

printf("2\n");

sleep(5);

return 0;
}

전 아무 이상없이
1
2
출력 됩니다....

소스에 실수가 없는지 살펴보세요.

아래건 그냥 테스트 용으로 만들어 봤어요 ^^;

#include
#include

int main()
{

if ( 0x0 == fork() )
{
// 자식 프로세스는 여기에서 반복 //
for (;;) {
printf("1\n");
sleep(1);
}
}

// 부모 프로세스는 여기에서 반복 //
for (;;) {
printf("2\n");
sleep(1);
}

return 0;
}

테스트 프로그램에서 보면
1
2
1
2
.... // 중략

2
1

출력 순서가 2,1 로 뒤집히는 경우가 생기는데 이게 가장 간단한 RACE CONDITION입니다.
서로 자원을 경쟁하면서 쓰기때문에 순서 보장이 안되는거죠.
순서를 보장하기 위해서 세마포어나 뮤텍스를 응용하죠.

1%의 가능성이면 충분하다!
최선을 다하자!

1%의 가능성이면 충분하다!
최선을 다하자!