2017-11-08 3 views
1

정확하게 프로세스 작업 방법을 이해하려고합니다. 더 구체적으로 어떤 코드가 실행되며, 어떤 코드가 실행되지 않습니다. 내가 이해하지 못하는 것을 설명하기 위해 몇 가지 예제 코드를 작성했다. 내가 이해에서C 프로세스 : fork() scope

int main(){ 

    //Program code part 1 

    int myfun(){ 
    if(fork()>0){ 

     //Program code part 2 

    } 
    return 0; 
    } 
    //Program code part 3 

} 

는, 부모 프로세스가 코드 파트 1과 3을 실행하고 myfun에 0을 반환해야합니다(). 아이는 파트 2를 실행해야합니다. 확실히 1이 아닙니다. 파트 3을 실행합니까? myfun()의 te 범위에서 생성 되었기 때문에 생각하지는 않지만 내 프로그램이 엉망이되기 전에 정말로 확신하고 싶습니다.

+0

'myfun'은'main' 내부에 정의되어 있습니다. 나는 gcc가 이것을 지원하는 확장 기능을 가지고 있다고 믿는다. (표준이 아니다.) 그러나 당신은 결코 그 기능을 호출하지 않는다. – Kevin

+1

'mainf 안에'myfun' *을 정의했습니다. C에서 그렇게 할 수는 없습니다. 질문을 clarifiy로 편집 할 수 있습니까? 'main'이'myfun'을 호출합니까? –

+0

C는 중첩 된 함수 정의를 허용하지 않습니다. – PSkocik

답변

3

성공적인 경우 fork>0 pid로 부모에게서 두 번, 어린이에서는 0으로 한 번 반환됩니다. 둘 다 그 시점에서 앞으로 나아 간다.

제어 흐름에 관한 한 그게 전부입니다.

는 코드 인 경우 :

int myfun() 
{ 
    if(fork()>0){ 
     //Program code part 2 
    } 
    return 0; 
} 
int main() 
{ 
    //Program code part 1 
    myfun(); 
    //Program code part 3 
    return 0; 

} 

후 부모가 파트 2를 실행하고 fork() 호출이 -1로 실패하지 않는 부모와 아이 모두 (파트 3를 실행,이 경우에는 아이가 없습니다).

자녀를 제한하려면 _exit(SomeExitCode)을 끝내야합니다.

(_exitstdio가 스트림 후자 fflush ES 같이 갈래 공정 exit 위에 일반적으로 바람직하다 atexit 핸들러를 호출하고,이 모든 부모 중복 그 filedescriptors 공정 이미지가 아이에서 바람직하지 않을 가능성 .)