2011-12-21 3 views

답변

6

C 및 C++에서 atexit()을 통해 등록 된 함수는 main()이 반환 된 후에 호출 할 수 있습니다. C의 ++에서

, static destructorsmain()의 복귀 후 호출 할 수 있습니다.

+0

내가 같은 것을 올리려고 한 것처럼 나는 당신을 투표했다. 하지만 기술적 인 측면에서, 주요 반환 전에 실행 된 atexit 호출은 등록되지 않았습니다. 바로 전에, 즉? – gnometorule

+1

@gnometorule, main()'*이 *를 반환 할 것이라고 프로그램에서 어떻게 알 수 있습니까? 리턴 코드가 기다릴 때까지 기다리는 것이 더 합리적입니다 (런타임 코드는 처음에'main()'을 호출하는 것이기 때문에) 적절하게 행동하십시오. –

+0

설명해 주셔서 감사합니다. 그것은 실제 질문이었습니다. 등록 된 atexit 함수를 호출하기 위해 exit sys 호출을 시각화했습니다.이 경우 exit 호출이 적절한 경우 그 다음에 호출이 반환됩니다. – gnometorule

2

어쩌면 다른 스레드가 main() 프로그램을 종료 한 후에도 계속 작업 할 수 있으므로 예라고 말할 수 있습니다.

public class Main extends Thread { 

    public static void main(String[] args) { 

     Thread thread = new Thread(new Main()); 
     thread.start(); 
     System.out.println("main is exiting"); 
    } 

    @Override 
    public void run() { 
     try { 
      sleep(1000); 
      System.out.println("thread is running"); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 

    } 
} 
+0

은 백그라운드 스레드가 아니면 종료됩니다. –

+0

아니요, 'exit (3)'을 호출하면 _all_ 스레드가 중지됩니다. 그래서'pthread_exit (3)'이 있는데, 하나의 스레드 만 종료 할 수 있습니다. – fge

+0

이것은 불가능합니다. –

1

예 C#의 경우 : main()이 종료 된 후에 범위를 벗어난 객체의 종료자가 나중에 실행됩니다.

가끔은 편리합니다. 잠금 파일을 제거하려면

-1

아니요, 불가능합니다. main 메소드가 존재하면 프로그램이 종료됩니다.

0

간단한 대답은 없습니다. 하지만 메인의 끝에서 언제나 새 스레드를 시작할 수 있으며 메인이 완료된 후에도 실행됩니다.

+0

주된 방법은 스레드가 중지 될 때까지 기다립니다. 데몬 스레드 인 경우 종료됩니다. –

+0

나는 동의하지 않는다. 이것을보십시오 : ** public class TestMain { public static void main (String [] args) { System.out.println ("main start"); 새로운 Thread (새의 Runnable() { 공공 무효 실행() { 동안 (사실) { } } }) 시작().; System.out.println ("주 끝"); } } ** 메인 메소드가 완료되었음을 의미하는 "메인 엔드"가 인쇄되어 있습니다. – Rox

+0

나는 동의하지 않는다. JVM은 다른 스레드가 완료되기를 기다리면서 main 메소드에서 반환되기 직전에 중지됩니다. 따라서 main 메소드의 모든 명령문을 실행하지만 프로그램은 아직 종료되지 않습니다. –

1

C++ : 확실합니다. 전역 객체의 소멸자에 넣기 만하면 main이 반환 된 후에 실행됩니다 (그러나 전역 객체가 아직 만들어지지 않았다는 보장은 없습니다).

(... 트릭은 실행 파일의 "진짜"엔트리 포인트는 일반적으로 main 아니라 전역을 초기화 또 다른 기능은, 주 당신을 호출하고 반환 할 때이 종료하기 전에 그들을 파괴한다는 것입니다,하지만)

1

당신이 가진 유일한 가능성은 fork(), 부모의 exit()입니다. 그 주위에는 다른 방법이 없습니다. 스레드가 도움이되지 않습니다.

1

C 및 C++에서 "정상"종료하는 동안 함수를 호출합니다 atexit(),있다.

0

C#에서 새 Thread을 만들 수 있습니다 false로 IsBackground을 설정합니다. Main이 종료되지만 .NET Framework가 수행해야하는 작업을 응용 프로그램에서 계속 유지합니다.

static void Main(string[] args) 
{ 
    Thread thread = new Thread(() => { 
     Thread.Sleep(10000); 
     Console.WriteLine("Thread WriteLine"); 
    }); 

    thread.IsBackground = false; 
    thread.Start(); 
    Console.WriteLine("Main WriteLine"); 
} 
관련 문제