我会尽量保持简单。我目前正在为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();
}
2015-05-18
Forset1
+0
您是否在'waitpid'调用中缺少'WCONTINUED'? –
+0
这样一个简单的解决方案......这正是问题所在。我写了“waitpid(new_pid,&status,WUNTRACED | WNOHANG | WCONTINUED);”它的工作原理。非常感谢! –