2011-11-28 13 views
16

Tôi đang cố gắng để chương trình của mình tự khởi động lại, nhưng không có gì có vẻ hiệu quả. Tôi đã thử sử dụng fork(), nhưng sau khi giết chết ,parent quá trình sốchild cũng bị giết.Làm cách nào để làm cho chương trình tự khởi động lại? (Quá trình Linux)

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; 
} 

Trả lời

13

Tại sao bận tâm với fork nếu bạn chỉ đi killcácparent? Chỉ cần thực hiện exec. Phiên bản mới của chương trình sẽ vẫn là quá trình tương tự nhưng sẽ được khởi động lại hiệu quả.

+0

Nó ra Chương trình 2 bắt đầu. Chương trình 2 bắt đầu. với thực hiện đơn giản ("prog2", NULL); Điều này làm tôi bối rối. Không nên nó hiển thị "Chương trình 2 chấm dứt."? – bvk256

+0

Nó sẽ không bao giờ gọi là "Chương trình 2 chấm dứt" vì cha mẹ đã tự chấm dứt bằng cách giết (getpid(), ...); –

+0

Ok, sau đó. Dù sao thông điệp này có thể dễ dàng đạt được bằng cách đặt nó ở những nơi mà một quá trình được đảm bảo chấm dứt. – bvk256

3

Sử dụng 2 cấp độ rèn. Một ứng dụng "giám sát" của cha mẹ sẽ tắt trẻ em và theo dõi trạng thái của chúng. Nếu một đứa trẻ chết, màn hình sẽ khởi động một màn hình mới. Các em sau đó tự mình cố gắng làm bất cứ điều gì họ phải làm. Tuy nhiên, nếu bạn không cần bản sao 'mới' của ứng dụng để có cùng trạng thái với trạng thái bị giết, thì việc sử dụng lệnh exec() để bắt đầu một bản sao độc lập mới có thể là một lựa chọn tốt hơn, tiết kiệm bạn phải có bản sao màn hình đó.