我會盡量保持簡單。我目前正在爲LINUX複製一個shell。我使用鏈表結構「job_list」來存儲所有後臺進程。如果後臺進程終止,那麼它將從列表中刪除。如果後臺進程掛起,則其列表中的狀態將從BACKGROUND更改爲STOPPED。如果進程被重新喚醒(通過SIGCONT信號),那麼想法是列表中的進程狀態應該改回到BACKGROUND。SIGCONT和LINUX中的waitpid()問題
我的問題如下:當我向進程發送一個SIGSTOP信號時,執行section // 1,並且它的狀態改變已成功註冊到列表中。但是,當我使用SIGCONT信號喚醒同一進程時,WIFCONTINUED(status)將返回false,但WIFEXITED(status)將始終返回true。因此,部分// 3將被執行,並且該進程將從列表中刪除。
什麼可能是錯的?提前致謝。
void sigchld_handler(){
block_SIGCHLD();
job *item;
int l_size = list_size(job_list);
int i, new_pid, pid_wait, status, info;
enum status status_res;
for (i = 1; i <= l_size; i++){
item = get_item_bypos(job_list, i);
new_pid = item->pgid;
pid_wait = waitpid(new_pid, &status, WUNTRACED | WNOHANG);
if (WIFSTOPPED(status)){
//1
printf("****SUSPENDED\n");
item->state = STOPPED;
}else if (WIFCONTINUED(status)){
//2
printf("****CONTINUED\n");
item->state = BACKGROUND;
}else if (WIFEXITED(status)){
//3
printf("****EXITED\n");
l_size--;
i--;
delete_job(job_list, item);
}
}
print_job_list(job_list);
unblock_SIGCHLD();
}
您是否在'waitpid'調用中缺少'WCONTINUED'? –
這樣一個簡單的解決方案......這正是問題所在。我寫了「waitpid(new_pid,&status,WUNTRACED | WNOHANG | WCONTINUED);」它的工作原理。非常感謝! – Forset1