main() 메소드를 종료 한 후에도 코드를 실행할 가능성이 있습니까?프로그램이 main()을 종료 한 후에도 코드를 실행할 수 있습니까
답변
C 및 C++에서 atexit()을 통해 등록 된 함수는 main()
이 반환 된 후에 호출 할 수 있습니다. C의 ++에서
, static destructors도 main()
의 복귀 후 호출 할 수 있습니다.
내가 같은 것을 올리려고 한 것처럼 나는 당신을 투표했다. 하지만 기술적 인 측면에서, 주요 반환 전에 실행 된 atexit 호출은 등록되지 않았습니다. 바로 전에, 즉? – gnometorule
@gnometorule, main()'*이 *를 반환 할 것이라고 프로그램에서 어떻게 알 수 있습니까? 리턴 코드가 기다릴 때까지 기다리는 것이 더 합리적입니다 (런타임 코드는 처음에'main()'을 호출하는 것이기 때문에) 적절하게 행동하십시오. –
설명해 주셔서 감사합니다. 그것은 실제 질문이었습니다. 등록 된 atexit 함수를 호출하기 위해 exit sys 호출을 시각화했습니다.이 경우 exit 호출이 적절한 경우 그 다음에 호출이 반환됩니다. – gnometorule
어쩌면 다른 스레드가 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();
}
}
}
은 백그라운드 스레드가 아니면 종료됩니다. –
아니요, 'exit (3)'을 호출하면 _all_ 스레드가 중지됩니다. 그래서'pthread_exit (3)'이 있는데, 하나의 스레드 만 종료 할 수 있습니다. – fge
이것은 불가능합니다. –
예 C#의 경우 : main()이 종료 된 후에 범위를 벗어난 객체의 종료자가 나중에 실행됩니다.
가끔은 편리합니다. 잠금 파일을 제거하려면
아니요, 불가능합니다. main 메소드가 존재하면 프로그램이 종료됩니다.
간단한 대답은 없습니다. 하지만 메인의 끝에서 언제나 새 스레드를 시작할 수 있으며 메인이 완료된 후에도 실행됩니다.
주된 방법은 스레드가 중지 될 때까지 기다립니다. 데몬 스레드 인 경우 종료됩니다. –
나는 동의하지 않는다. 이것을보십시오 : ** public class TestMain { public static void main (String [] args) { System.out.println ("main start"); 새로운 Thread (새의 Runnable() { 공공 무효 실행() { 동안 (사실) { } } }) 시작().; System.out.println ("주 끝"); } } ** 메인 메소드가 완료되었음을 의미하는 "메인 엔드"가 인쇄되어 있습니다. – Rox
나는 동의하지 않는다. JVM은 다른 스레드가 완료되기를 기다리면서 main 메소드에서 반환되기 직전에 중지됩니다. 따라서 main 메소드의 모든 명령문을 실행하지만 프로그램은 아직 종료되지 않습니다. –
C++ : 확실합니다. 전역 객체의 소멸자에 넣기 만하면 main
이 반환 된 후에 실행됩니다 (그러나 전역 객체가 아직 만들어지지 않았다는 보장은 없습니다).
(... 트릭은 실행 파일의 "진짜"엔트리 포인트는 일반적으로 main
아니라 전역을 초기화 또 다른 기능은, 주 당신을 호출하고 반환 할 때이 종료하기 전에 그들을 파괴한다는 것입니다,하지만)
당신이 가진 유일한 가능성은 fork()
, 부모의 exit()
입니다. 그 주위에는 다른 방법이 없습니다. 스레드가 도움이되지 않습니다.
C 및 C++에서 "정상"종료하는 동안 함수를 호출합니다 atexit(),있다.
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");
}
달성하고자하는 구체적인 코드 예제를 제공하지 않는 이유는 무엇입니까? – Adam
모든 언어를 사용하는 것이 의미가 없습니다. –
그런 일이 가능하다고 생각하는 이유는 무엇입니까? – karlphillip