2012-09-20 207 views
0

我正在執行一個文件作爲守護進程。我怎樣才能停止守護進程?如何停止守護進程

int main(int argc, char **argv) 
{ 
    if (argc != 5) 
    { 
     printf ("Usage: %s <server> <nick> <channel> <logging>\n", argv[0]); 
     return 1; 
    }  
    char *startPath = malloc(sizeof(char) *100); 

strcpy(startPath,"/home/.../start");  

int child_pnr; 

if(daemonisieren() != 0) 
{ 
    printf("damonization not possible"); 
    exit(0); 
} 

printf("I am a damon \n"); 

if((child_pnr = fork())==0) 
{  
    execve(startPath,argv); 
} 
else if (child_pnr > 0) 
{ 
    printf("I am parent and have a child \n"); 
    wait(child_pnr); 
} 

printf("gone....\n"); 

free(startPath); 
} 

我相信我可以殺死它,就像殺(childnr),但父進程等待子執行完成,他可能永遠不會做我必須有它知道childnr並殺死它的程序。我怎樣才能做到這一點?

回答

1

您可以使用許多不同的方法使孩子的進程號碼可用,所有這些方法都可以有效。一個簡單的方法是將其存儲到系統中的文件中。如果你看看/var/run,你可能會發現許多XXX.pid文件。

也許對於你的用例來說,一個更好的解決方案是在你父母的一個新線程中啓動一個新線程(或者讓它分叉第二個子線程),在一段時間內執行一次睡眠,如果這段時間過去了,兒童。如果主小孩自行終止,滿足父母的等待,父母可以殺死「看門狗」孩子(或線程)。

+0

謝謝...第二種方法很好,但程序可能會運行幾個小時...不知道多久...第一個是好的,但如果我想讀/ var/run我需要具有我的應用程序可能沒有的根... – Fendrix

+0

如果你可以在那裏寫入,那麼位置/ var/run是方便的(而且是合適的),但是沒有關於位置的任何魔術......你有寫入權限的任何地方應該沒事。至於看門狗並且運行幾個小時,一個線程(用於初始細節的'man pthread_create')將非常輕量級。 – mah

+0

@Fendrix,當你想要殺死子進程時你有什麼標準?如果你發送一個信號給你的父進程,等待會返回,並出錯並將errno設置爲EINTR。所以你可以使用這個事實,如果父進程收到一個信號,kill()子進程。 – nos