我会尽量保持简单。我正在为LINUX复制一个shell。我使用链表结构“job_list”来存储所有后台进程。如果后台进程终止,则将其从列表中删除。如果后台进程暂停,则其在列表中的状态将从BACKGROUND更改为STOPPED。如果重新唤醒进程(通过SIGCONT信号),那么想法是列表中的进程状态应该更改回BACKGROUND。
我的问题如下:当我向进程发送SIGSTOP信号时,执行// 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();
}
答案 0 :(得分:1)
您在WCONTINUED
的通话中似乎缺少waitpid
值。
来自waitpid
specification:
pid_t waitpid(pid_t pid, int *stat_loc, int options);
options参数是从头部中定义的零个或多个以下标志的按位包含OR构造的:
WCONTINUED
waitpid()函数应报告pid指定的任何继续子进程的状态,该进程的状态自作业控制停止后继续报告。