2014-12-23 8 views
1

내가이 C 코드 시퀀스가 ​​작동합니다. 첫 번째 줄에서는 fork()을 호출하고 첫 번째 부모 프로세스에서 줄 # 1부터 줄 # 4까지의 모든 내용이 실행됩니다. 상위 프로세스 (1)에서 한 번 더 fork()을 호출하므로 2 번 줄부터 3 번 줄까지 부모 2 프로세스가 생기고 3 번에서 4 번 자식 프로세스까지 처리됩니다. 실제로이해하는 방법을 포크() 시스템 호출은

Parent 1 PID: .... 
0 
1 
2 
3 
4 
5 
6 
7 
8 
9 
Parent 2 PID: .... 
a 
b 
c 
d 
e 
Child 2 PID: .... 
F 
G 
H 
I 
Child 1 PID: .... 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 

있어 무엇 : 나는 인쇄 할 것으로 예상 무엇

내가 잘못 할 무엇
Parent 1 PID: 3877 

0 
1 
2 
3 
4 
5 
6 
7 
8 


Parent 1 PID: 3878 

0 
1 
2 
3 
4 
5 
6 
7 
8 
9 

Parent 2 PID: 3877 

a 
b 
c 
d 
e9 

Parent 2 PID: 3878 
9 


a 
b 
c 
d 
Parent 2 PID: 3879 

a 
b 
c 
d 
e9 

eParent 2 PID: 3880 

a 
b 
c 
d 
e 

?

+3

'fork()! = -1'는 무엇을 확인합니까? –

+0

호출이 실패하면 -1이 리턴됩니다. 그래서 전화가 끊어지지 않았는지 확인합니다. –

+0

그래서'else' 블록은 무엇을합니까? –

답변

3

이 줄은 당신이 생각하는 일을하지 않습니다 : 부모와 아이 모두 성공

if(fork() != -1) { // #1 

(한 fork로이 경우 거의 항상하는 것이 가능하다). 여기에 0에 대한 테스트를 의미합니다. 부모는 0을, 자식은 0보다 커집니다. -1은 오류입니다.

"아이"다리로 표시 한 내용은 오류가 발생하지 않는 한 절대로 실행해서는 안됩니다. 나는 그것이 당신이 의미 한 것이라고 생각하지 않습니다. 당신이보고있는 것은 초기 2 (부모와 자식) 포크와 4 (부모 + 자식 * 2) 포크입니다. 이것은 출력이 나타내는 6 가지 포크입니다. man fork에서

2

:

switch(pid = fork()) { 
    case -1: //error handling here 
    case 0: // child process code here 
    default: // parent process code here. 
} 
:

RETURN VALUE 
     On success, the PID of the child process is returned in the parent, and 0 is returned in the child. On failure, -1 is returned in the parent, no child process is created, and errno 
     is set appropriately. 

이것은 당신이 자식 프로세스에서 0을 기대하고 부모 프로세스에서 차일 PID, 그래서 당신의 코드는 다음과 같은 모양해야한다는 것을 의미한다

메리 크리스마스 :)

+2

나는 크리스마스를 좋아하지만, 나는 결혼하지 않을 것이다. ; v) 당신에게 메리 크리스마스. –

+1

하하 감사합니다 .-D 나는 네가 추측 한 것처럼 원어민이 아니다;) – linluk

+1

이 코드에 와서 무료 문법 수업을 위해 머물렀다 : +1 – marcio