首先,我使用 for 回圈創建多個子行程。然后,我將所有子行程置于睡眠狀態(通過添加無限睡眠塊)。
void kill_child(int sig);
int main(void){
signal(SIGHUP, kill_child);
for(int i = 0; i < max_child; i ){
pid_t id = fork();
if(id == 0){
printf("Hi, i am a child\n");
while(1){sleep(1);}
}
if(id == 1){
printf("Hi, i am a parent\n");
}
}
}
void kill_child(int sig){
if(sig==SIGHUP){
//do stuff to kill single child
}
}
我接下來打算做什么,從終端發送 kill -HUP 父行程以逐個殺死子行程。最后,如果沒有子行程終止程式。
我只是想知道在這種情況下有沒有辦法一次殺死一個孩子。
uj5u.com熱心網友回復:
我認為您可以使用具有全域范圍的陣列來保護兒童的 pid,然后將其用于函式 kill_child 呼叫:int kill(pid_t pid, int sig)。在 kill_child 中,我認為如果您想發送 SIGTERM,您可以向孩子發送 SIGKILL 或使用信號函式重新定義行為。這可以是一個解決方案。Aniway,我注意到您的代碼中有一些可以改進的地方(以我的拙見):
- 我不確定您的程式是否會列印“嗨,我是父母\n”,因為您無法確定至少有一個孩子的 pid = 1(除非您出于其他原因確定)
- while 回圈會產生大量開銷,因為每一秒你都會重新激活一個行程,而這個行程遲早會占用 CPU 僅用于呼叫 sleep 等待一秒鐘
我希望我對你有所幫助!
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/425661.html
上一篇:如果awk命令中的條件在BEGIN塊中沒有按預期作業。如果我錯了,請糾正我
下一篇:使用unixsed替換js路徑