2011-11-28 18 views
16

Programımı yeniden başlatmaya çalışıyorum ama hiçbir şey işe yaramıyor gibi görünüyor.kullanmayı denedim, ancak parentişlemini öldürdükten sonra da öldürülür.Bir program kendini nasıl yeniden başlatır? (Linux süreci)

KOD

void sigup_handler(int signum) { 
    int pid = fork(); 
    if (pid == 0) { 
     execve("prog2", NULL); 
    } 
    else 
     kill(getpid(), SIGTERM); 
} 

int main() { 
    puts("Program 2 started."); 
    signal(SIGHUP, sigup_handler); 
    sleep(50); 
    puts("Program 2 terminated."); 
    return 0; 
} 

cevap

13

sadece killparentgidiyoruz, neden fork ile rahatsız? Sadece exec'u yapın. Programın yeni örneği hala aynı süreç olacak ancak etkin bir şekilde yeniden başlatılacak.

+0

Bu Program 2 başlatan çıkışı izledi kullanabilirsiniz. Program 2 başladı. basit yürütme ile ("prog2", NULL); Bu beni şaşırttı. "Program 2 sonlandırıldı" görüntülememeli mi? – bvk256

+0

"Program 2 sonlandırıldı" diye hiçbir zaman çağrılamaz; çünkü ebeveyn kendisini (killpid(), ...); –

+0

Tamam, o zaman. Her neyse, bu mesaj bir sürecin sonlandırılacağı garanti edilen yerlere yerleştirilerek kolayca elde edilebilir. – bvk256

3

2 düzey forking kullanın. Çocukları engelleyen ve durumlarını izleyen bir ebeveyn "monitör" uygulaması. Bir çocuk ölürse, monitör yeni bir tane başlar. Çocuklar daha sonra yapmak zorunda oldukları her şeyi yapmak için kendi başlarına çıkmazlar. Öyleyse, uygulamanın yeni bir kopyasına ihtiyaç duymazsanız, uygulamanın öldürülmesiyle aynı duruma sahip olmanız gerekiyorsa, daha sonra yeni bir kopyasını başlatmak için exec() işlevini kullanmak daha iyi bir seçenektir. Monitörün kopyalarını oturmuş olman gerekiyor.

İlgili konular